Ich habe Folgendes ausgeführt, um einen Begriff zu ersetzen, der in allen Dateien im aktuellen Arbeitsverzeichnis verwendet wird:
$ find . -type f -print0 | xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'
Dies führte die Wortersetzung durch, erzeugte aber auch .bup
Dateien von Dateien, die nie die Ms. Johnson
Zeichenfolge hatten.
Wie führe ich die Ersetzung durch, ohne all diese unnötigen Sicherungen zu erstellen?
linux
shell-script
scripting
sed
Belmin Fernandez
quelle
quelle
ex
, der:!cp '%' '%.bup'
vor dem Speichern und Beenden ausgeführt wird (nur wenn die Datei geändert wurde) . Könnte einen Blick wert sein.vi
Stapelaustausch geschrieben.Antworten:
Sie können den Inhalt der Dateien überprüfen, um sicherzustellen, dass eine Ersetzung stattfindet, wenn
sed
sie ausgeführt werden:Wenn Sie wirklich schlau sein wollen, können Sie auf Folgendes verzichten
find
:quelle
'{}'
kurz vor Ihrer\;
dass-exec
.Find hat einen
-exec
Operator, der einen beliebigen Befehl ausführt. Noch besser-exec
ist ein Test , mit dem Sie mehrere-exec
s miteinander verketten können. Wenn frühere Befehle fehlschlagen, werden spätere nicht ausgeführt. Die Zeichenfolge{}
wird durch den aktuellen Dateinamen ersetzt und;
markiert das Ende des Befehls. Sie sollten beide angeben, um eine Störung der Shell zu vermeiden.So:
quelle
{}
bei der Klammererweiterung auf den Null-String expandieren.Ich habe auf die Manpage geschaut und keine Möglichkeit gefunden, dies direkt zu tun
sed
, wie Sie es sicher getan haben, bevor Sie gefragt haben. Ich sehe verschiedene Möglichkeiten, um dies mit grep zu umgehen, aber ich denke, das ist das einfachste:-r
recurse-l
print filename endet nur-Z
mit nullquelle
Anscheinend müssen Sie zuerst eine Liste der Dateien erstellen, die Ihren Suchbegriffen entsprechen.
quelle
.
als erstes Argument vergessenfind
. Auch, wie ich selbst vor nicht allzu langer Zeit informiert wurde, müssen Sie nicht wirklich zitieren oder dem{}
find
wird eine durch Zeilenumbrüche getrennte Liste von Dateien erstellt, dann wird diese Liste von der Shell in Leerzeichen (nicht nur in Zeilenumbrüche) aufgeteilt, und anschließend wird jedes Wort von der Shell als Glob-Muster behandelt. Dies funktioniert nur, wenn Ihre Dateinamen keine Leerzeichen oder enthalten\[?*
. Andere Antworten auf dieser Seite zeigen, wie dies richtig gemacht wird..
ist bei find unnötig (zumindest find unter Linux), da angenommen wird, dass kein Pfad ein Argument übergibt .