Gibt es eine Möglichkeit, eine rekursive Testsuche und -ersetzung durchzuführen sed
, bevor sie ausgeführt wird? Ich möchte nur die Ergebnisse ausdrucken, bevor ich wirklich suche und ersetze. So etwas wie das Echo der Ergebnisse von,
grep -rl term1 . |xargs sed -i -e 's/term1/term2/'
Antworten:
Sie könnten
sed
ohne laufen-i
und die Ausgabe mit schrittweise durchlaufenless
Führen Sie dann
sed
mit aus-i.bak
, um Backups zu erstellen, die Sie anschließend unterscheiden könnenBearbeiten: Wie im Kommentar vorgeschlagen, verwenden Sie
grep --null | xargs -0
. Dadurch werden Dateinamen mit dem Null-Byte abgeschlossen, wodurch Dateinamen mit ungewöhnlichen Zeichen wie Newline geschützt sind. Ja,\n
ist ein gültiges Zeichen in einem Unix-Dateinamen. Die einzigen verbotenen Zeichen sind Schrägstriche/
und Nullen\0
quelle
grep -rl --null
da OP kein Betriebssystem spezifiziert hat und-Z
unter BSD / OSX (Dekomprimierung) etwas anderes bedeutet.--null
ist auf GNU und BSD gleichgrep
eine Abzweigung von GNU grep unter FreeBSD und NetBSD ist. Unter NetBSD heißt das-Z
immer noch--null
(laut Manpage), aber ich stimme zu, dass --null portabler ist. Beachten Sie auch, dass weder --null noch -Z unter OpenBSDsed -i '' -e s/.../
in BSDsed
(keine optionalen Optionen gibt)Verwenden Sie
sed
mitfind
anstelle vongrep
Zunächst würde ich
find
eher als beschäftigengrep
, und dies aus drei guten Gründen:find
Ermöglicht eine genauere Dateiauswahl. Beispielsweisegrep -r string *.txt
werden Dateien nur im aktuellen Verzeichnis ausgegeben. nicht die in Unterverzeichnissen.find
kommt mit der leistungsstarken-exec
Option, die das gesamte--null … |xargs 0
Konstrukt überflüssig macht.-readable
und-writable
vonfind
verhindern, dass Zeit für Dateien verschwendet wird, auf die nicht zugegriffen werden kann.Capture-Test
Das heißt,
grep
bietet sich für einen ersten Test an, um zu sehen, was erfasst werden würde:oder genauer:
Probelauf
Fahren Sie nun mit einem
sed
Trockenlauf fort. Diesed
Option-n
ist ein Synonym für--quiet
undp
am Ende dessed
Ausdrucks wird der aktuelle Musterbereich gedruckt.oder genauer:
Ausführung
Wenn alles in Ordnung ist, setzen Sie den endgültigen Befehl ab, indem Sie die
sed
Option-n
durch-i
"in place" ersetzen und diep
am Ende stehende entfernen .oder genauer:
Weitere
find
BeispieleWeitere
find
Beispiele finden Sie hier .quelle