Welches GNU / Linux-Kommandozeilen-Tool würde ich für eine Suche durchführen und ersetzen auf einer Datei?
Frage
Welches GNU / Linux-Kommandozeilen-Tool würde ich für eine Suche verwenden und ersetzen auf einer Datei?
Können der Suchtext und Ersatz, in einem regex Format angegeben werden?
Lösung
sed 's/a.*b/xyz/g;' old_file > new_file
GNU sed (die Sie wahrscheinlich haben) ist noch vielseitiger:
sed -r --in-place 's/a(.*)b/x\1y/g;' your_file
Hier ist eine kurze Erklärung dieser Optionen:
-i [SUFFIX], --in-place [= SUFFIX] Bearbeiten von Dateien in Ort (macht Backup wenn Erweiterung mitgeliefert)
-r, --regexp-extended verwenden erweiterte reguläre Ausdrücke im Skript.
Die FreeBSD Version unterstützt auch diese Optionen. Die NetBSD und OpenBSD Versionen unterstützen nur -r
.
Wenn Sie mehr über sed lernen, Cori hat vorgeschlagen, diesem Tutorial .
Andere Tipps
Perl wurde für diese erfunden:
perl -pi -e 's/foo/bar/g;' *.txt
Jeder normale s /// Muster in diesen einfachen Anführungszeichen. Sie können mit so etwas wie dies eine Sicherung halten:
perl -pi.bak -e 's/foo/bar/g;' *.txt
oder Pipeline:
cat file.txt | perl -ne 's/foo/bar/g;' | less
Aber das ist wirklich mehr Aufgabe des sed.
Betrachten Rubin als Alternative zu Perl. Es stahlen die meisten Perl Einzeiler Command args (-i
, -p
, -l
, -e
, -n
) und Auto-Sets für Sie $_
wie Perl tut und hat viel regex Güte. Zusätzlich Rubys Syntax kann bequemer und einfacher sein, die lesen oder zu schreiben, als Perl oder sed. (Oder auch nicht, je nach Ihrem Geschmack.)
ruby -pi.bak -e '$_.gsub!(/foo|bar/){|x| x.upcase}' *.txt
vs.
perl -pi.bak -e 's/(foo|bar)/\U\1/g' *.txt
In vielen Fällen, wenn sie mit Einzeiler tun haben, ist die Leistung nicht genug ein Problem zu kümmern, ob Sie leichte sed oder Schwergewicht Perl oder heaveier Gewicht Rubin verwenden. Verwenden Sie, was am einfachsten schreiben.
sed , der Stream-Editor, und ja, es nutzt regex.