2012-04-29 1 views
12

Ich habe diesen Befehl ein:AWK - Sub- und Gsub-Funktion?

$ find $PWD -name "*.jpg" | awk '{system("echo " $(sub(/\//, "_"))) }' 
_home/mol/Pulpit/test/1.jpg 

Nun ist die gleiche Sache, aber mit gsub:

$ find $PWD -name "*.jpg" | awk '{system("echo " $(gsub(/\//, "_"))) }' 

[email protected]:~ 

Ich möchte das Ergebnis erhalten:

_home_mol_Pulpit_test_1.jpg 

Vielen Dank für Ihre Hilfe.

EDIT:

Ich habe 'echo' den Befehl zu testen:

$ find $PWD -name "*.jpg" | awk '{gsub("/", "_")} {system("echo " mv $0 " " $0) }' 
_home_mol_Pulpit_test_1.jpg _home_pic_Pulpit_test_1.jpg 

[email protected]:~ 

Ich möchte das Ergebnis erhalten:

$ find $PWD -name "*.jpg" | awk '{gsub("/", "_")} {system("echo " mv $0 " " $0) }' 
/home/pic/Pulpit/test/1.jpg _home_pic_Pulpit_test_1.jpg 

[email protected]:~ 

Vielen Dank für Ihre Hilfe.

+2

Werfen Sie einen Blick auf die 'rename' Befehl. Es gibt zwei Versionen. Eines ist ein Perl-Skript, das manchmal ['vorname'] genannt wird (http://man.he.net/man1/prename). Ein anderer ist Teil des Pakets ['util-linux-ng'] (https://launchpad.net/util-linux-ng). Beide können den Umbenennungstyp ausführen. –

+0

Danke für die Links. – Tedee12345

Antwort

18

, die nicht funktionieren, wenn die Zeichenfolge mehr als eine Übereinstimmung enthält ... versuchen Sie dies:

echo "/x/y/z/x" | awk '{ gsub("/", "_") ; system("echo " $0) }' 

oder besser (wenn die echo keinen Platzhalter für etwas anderes):

echo "/x/y/z/x" | awk '{ gsub("/", "_") ; print $0 }' 

In Ihrem Fall sollten Sie eine Kopie des Wertes machen vor dem Wechsel:

echo "/x/y/z/x" | awk '{ c=$0; gsub("/", "_", c) ; system("echo " $0 " " c)}'