Quale strumento da riga di comando GNU / Linux dovrei usare per eseguire una ricerca e sostituire un file?
Domanda
Quale strumento da riga di comando GNU / Linux dovrei usare per eseguire una ricerca e sostituire un file?
È possibile specificare il testo di ricerca e la sostituzione in un formato regex?
Soluzione
sed 's/a.*b/xyz/g;' old_file > new_file
GNU sed (che probabilmente hai) è ancora più versatile:
sed -r --in-place 's/a(.*)b/x\1y/g;' your_file
Ecco una breve spiegazione di queste opzioni:
-i [SUFFIX], --in-place [= SUFFIX] modifica i file in atto (esegue il backup se l'estensione viene fornita)
-r, --regexp-extended usa espressioni regolari estese nello script.
La versione FreeBSD supporta anche queste opzioni. NetBSD e OpenBSD le versioni supportano solo -r
.
Se vuoi saperne di più su sed, Cori ha suggerito questo tutorial .
Altri suggerimenti
Perl è stato inventato per questo:
perl -pi -e 's/foo/bar/g;' *.txt
Qualsiasi modello s /// normale tra quelle virgolette singole. Puoi mantenere un backup con qualcosa del genere:
perl -pi.bak -e 's/foo/bar/g;' *.txt
O pipeline:
cat file.txt | perl -ne 's/foo/bar/g;' | less
Ma questo è davvero il lavoro di sed.
Considera Ruby come alternativa a Perl. Ha rubato la maggior parte degli args a riga di comando di Perl ( -i
, -p
, -l
, -e
, -n
) e imposta automaticamente $ _
per te come fa Perl e ha un sacco di bontà regex. Inoltre, la sintassi di Ruby può essere più comoda e più facile da leggere o scrivere rispetto a Perl o sed. (O no, a seconda dei tuoi gusti.)
ruby ??-pi.bak -e '$ _. gsub! (/ foo | bar /) {| x | x.upcase} '* .txt
vs.
perl -pi.bak -e 's / (foo | bar) / \ U \ 1 / g' * .txt
In molti casi quando si ha a che fare con una linea, le prestazioni non sono sufficienti per preoccuparsi se si utilizza sed leggero o Perl pesante o Ruby più pesante. Usa ciò che è più semplice da scrivere.
sed , l'editor di stream e sì, utilizza regex.