2016-10-30 21 views
0

i einen Bash-Befehl habe, die eine Liste von Dateien, für die ich die Dateinamen ändern muß, erzeugt. so war ich zu denken, so etwas wie dies mit:wie ein awk-Variable mit verändern sed

mycommand | awk {mv $1 altered$1} 

das Problem ist, dass der zweite $ 1 geändert werden soll, mit sed einiger regulären Ausdrücke zu ersetzen. Wie kann ich sed auf den zweiten Parameter anwenden?

Ich habe versucht, mit $() und |, aber es funktioniert nicht.

Ich habe auch versucht

awk '{print $1 sed "s/[^A-Za-z0-9._-]/_/g" <<< $1}' 
awk: cmd. line:1: Unexpected token 
+0

Haben Sie überlegt, die zurückgegebene Liste der Dateinamen von Ihrem Befehl zu durchlaufen und sie mit 'sed' zu modifizieren? 'für den Dateinamen in $ (mycommand); MW $ Dateiname $ tun (Sed "s/[^ A-Za-Z0-9 ._-]/_/g" <<< $ filename); fertig. – Abdou

+0

Beachten Sie, dass ein 'für den Dateinamen in $ (mycommand) 'fehlschlägt, wenn ein Dateiname Leerzeichen enthält. Eine while-Schleife kann das vermeiden. – John1024

+0

erinnern, dass 'awk' die 'sub()' und 'gsub()' Funktionen hat und dass sie das meiste tun können, was 'sed's/str/repl /' 'tun kann. Sie müssen möglicherweise mehrere '[g] sub (/ regex /, "repl", "str") Operationen ausführen, um zu erhalten, was Sie brauchen. Viel Glück. – shellter

Antwort

1

mv kein awk ist. Sie brauchen Schale. Versuchen:

mycommand | while IFS= read -r f; do mv "$f" "${f//[^A-Za-z0-9._-]/_}"; done 

Dies setzt voraus, dass die Dateinamen Newline getrennt sind. Dies ist OK, es sei denn, ein Dateiname enthält eine neue Zeile als Teil seines Namens. Für eine bessere Zuverlässigkeit sollten mycommand und die while-Schleife geändert werden, um NUL als Trennzeichen zu verwenden.

Wie es funktioniert:

  • while IFS= read -r f; do

    Dies beginnt eine Schleife, die jede Zeile liest, die wiederum in variable f.

    IFS= sagt der Shell auf einer Linie, die die führende oder nachfolgende Leerzeichen zu halten. Wenn mycommand überflüssige führende oder nachfolgende Leerzeichen erzeugt, entfernen Sie diese.

    -r sagt der Shell, Schrägstriche in den Eingang zu halten, wie sie sind.

  • mv "$f" "${f//[^A-Za-z0-9._-]/_}"

    Diese benennt die Datei.

  • done

    Dies signalisiert das Ende der Schleife while.

1

Wird subshell von Ihnen akzeptiert? Wenn ja, eine einfache Art und Weise Sie wie folgt tun:

mv `mycommand | awk '{print $1}'` {altered$1} 
0

Verwenden rename (immer in Debian basierten Distributionen installiert, über die erforderlichutil-linux Paket):

rename 's/^/altered/' $(mycommand)