Altre soluzioni combinano sintassi regex. Per utilizzare Perl/modelli PCRE per sia ricerca e sostituzione, e di evitare l'elaborazione di tutti i file, questo funziona abbastanza bene:
grep -rlZP 'match1' | xargs -0r perl -pi -e 's/match2/replace/g;'
dove match1
e match2
sono di solito identiche ma match1
può essere semplificata per rimuovere funzionalità più avanzate che sono rilevanti solo per la sostituzione, ad es catturare gruppi.
Traduzione: grep in modo ricorsivo ed elenca i file corrispondenti, separati da nul per proteggere eventuali caratteri speciali nel nome del file, che corrispondono a questo modello PCRE, quindi reindirizzare quei nomi di file a xarg che si aspetta un elenco nullo-separato, ma non fare qualsiasi cosa se non si ricevono nomi e ottenere da Perl riscrivere ogni file, sostituendo le linee in cui si trovano le corrispondenze.
Aggiungere l'opzione I
a grep
per ignorare anche i file binari.
Non credo che grep possa farlo (potrei sbagliarmi). Modi più semplici sarebbero usare sed o perl per fare la sostituzione –
Prova ad usare la sottostringa 'sed -i '/.*. */Replace /'' –
@Eddy_Em Che sostituirà l'intera linea con replace. È necessario utilizzare il raggruppamento per acquisire la parte della linea prima e dopo la sottostringa e quindi inserirla nella riga di sostituzione. 'sed -i 's/\ (. * \) sottostringa \ (. * \)/\ 1replace \ 2 /'' – JStrahl