I ragazzi della GNU REALMENTE hanno incasinato quando hanno introdotto il file ricorsivo alla ricerca di grep. grep è per trovare i RE nei file e stampare la riga corrispondente (g/re/p ricorda?) NON per trovare i file. C'è un ottimo strumento con un nome molto ovvio per trovare i file. Qualunque cosa sia accaduta al mantra UNIX di fare una cosa e farla bene?
In ogni caso, ecco come si farebbe ciò che si vuole utilizzare l'approccio tradizionale UNIX (non testata):
find /path/to/folder -type f -print |
while IFS= read -r file
do
awk -v old="$oldstring" -v new="$newstring" '
BEGIN{ rlength = length(old) }
rstart = index($0,old) { $0 = substr($0,rstart-1) new substr($0,rstart+rlength) }
{ print }
' "$file" > tmp &&
mv tmp "$file"
done
Non che utilizzando awk/index() al posto di sed e grep di evitare la necessità di sfuggire a tutti i metacaratteri di RE che potrebbero apparire nella tua vecchia o nella tua nuova stringa, oltre a capire un carattere da usare come delimitatore di sed che non può apparire nelle tue vecchie o nuove stringhe e che non devi eseguire grep poiché la sostituzione si verifica solo per i file che contengono la stringa desiderata. Detto questo, se non si desidera modificare il timestamp del file se non si modifica il file, basta fare un diff su tmp e il file originale prima di fare il mv o lanciare un fgrep -q prima del awk.
Avvertenza: quanto sopra non funzionerà per i nomi di file che contengono newline. Se ne hai, quindi faccelo sapere e possiamo mostrarti come gestirli.
fonte
2013-04-11 12:53:39
Le parentesi quadre possono avere bisogno di essere sfuggito. Anche la doppia citazione del modello sed. – phs
Avrai anche un problema con '/' nei tuoi pattern. Dovrebbero essere scappati. Oppure potresti usare un altro delimitatore per il comando 's' (ad es.' @ '). –