2012-04-29 16 views
12

Ho questo comando:AWK - funzione sub e gsub?

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

Ora la stessa cosa, ma utilizzando gsub:

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

[email protected]:~ 

voglio ottenere il risultato:

_home_mol_Pulpit_test_1.jpg 

Grazie per il vostro aiuto.

EDIT:

ho messo 'echo' per testare il comando:

$ 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]:~ 

voglio ottenere il risultato:

$ 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]:~ 

Grazie per il vostro aiuto.

+2

Date un'occhiata al comando 'rename'. Ci sono due versioni. Uno è uno script Perl a volte chiamato ['prename'] (http://man.he.net/man1/prename). Un altro fa parte del pacchetto ['util-linux-ng'] (https://launchpad.net/util-linux-ng). O puoi fare il tipo di ridenominazione che stai facendo. –

+0

Grazie per i collegamenti. – Tedee12345

risposta

18

Questo non funzionerà se la stringa contiene più di una partita ... provare questo:

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

o superiore (se il echo non è un segnaposto per qualcos'altro):

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

Nel tuo caso si vuole fare una copia del valore prima di cambiarlo:

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