Verwenden von ed zum Bearbeiten von mit find übereinstimmenden Dateien
-
25-09-2019 - |
Frage
Im Anschluss an die Empfehlung des Bash-Hackers-Wikis, ich möchte Dateien mit ed bearbeiten.
Insbesondere möchte ich mit ed anstelle von sed Folgendes tun:
find . -type f -exec sed -i -e 's/a/b/g' {} \;
Ich sehe, dass ed kein opt wie seds -e hat, daher sind meines Wissens Pipes und io-Umleitungen die einzige Möglichkeit, nicht interaktiv damit zu arbeiten.
Wenn Sie also ed aus einem Bash-Skript verwenden, um dasselbe wie den obigen sed-Befehl zu tun, würde das folgendermaßen aussehen:
ed file_name <<<$'g/a/s//b/g\nw'
Oder
echo $'g/a/s//b/g\nw' | ed file_name
Soweit ich weiß, ist es jedoch unmöglich, Pipes oder Io-Umleitungen in die -exec von find einzubeziehen.
Vermisse ich etwas?Oder ist die einzige Möglichkeit, dies zu überwinden, die Verwendung von Schleifen?
for file in $(find . -type f -print); do ed $file <<<$'g/a/s//b/g\nw'; done;
Lösung
find . -type f -exec bash -c 'ed -s "$2" <<< "$1"' _ $'g/a/s//b/g\nw' {} \;
Und eine POSIX-Version:
find . -type f -exec sh -c 'printf "%s\n" "g/a/s//b/g" w | ed -s "$1"' _ {} \;
Der Hauptgrund für die Verwendung von ed anstelle von sed -i besteht darin, dass ed Dateien bearbeitet, während sed -i Dateien überschreibt, und das ist ein Problem, wenn Sie Links haben, die Sie nicht zerstören möchten.
Andere Tipps
Dieses Find & Ed-Snippet verfügt über einen Testmodus (damit Sie direkt vor einem tatsächlichen Massenersetzungsvorgang überprüfen können, ob Sie Ihre Regex erhalten haben):
Suchen und ersetzen durch Suchen und Bearbeiten
Fügen Sie den Befehl ed mit allen Umleitungen und „Here-Dokumenten“ in ein Shell-Skript ein und rufen Sie ihn über „find“ auf.
Aber ich muss fragen:Warum Ed?Was können Sie Ihrer Meinung nach mit ed machen, was Sie mit sed nicht machen können?