Sie könnten nutzen sed
‚s w
Flagge mit entweder /dev/stderr
, /dev/tty
, /dev/fd/2
wenn auf Ihrem System unterstützt. ZB mit einer Eingabe file
wie:
foo first
second: missing
third: foo
none here
Laufen
sed -i '/foo/{
s//bar/g
w /dev/stdout
}' file
Ausgänge:
bar first
third: bar
obwohl der file
Inhalt geändert wurde in:
bar first
second: missing
third: bar
none here
Also in Ihrem Fall läuft:
find . -type f -printf '\n%p:\n' -exec sed -i '/foo/{
s//bar/g
w /dev/fd/2
}' {} \;
bearbeitet die Dateien direkt und gibt sie aus:
./Datei1:
Bar Zeug
mehr bar
./Datei2:
./Datei3:
Bar zuerst
drittens: bar
Sie könnten auch etwas wie original line >>> modified line
zB drucken :
find . -type f -printf '\n%p:\n' -exec sed -i '/foo/{
h
s//bar/g
H
x
s/\n/ >>> /
w /dev/fd/2
x
}' {} \;
bearbeitet die Dateien an Ort und Stelle und gibt Folgendes aus:
./Datei1:
Foo Stuff >>> Bar Stuff
mehr foo >>> mehr bar
./Datei2:
./Datei3:
Foo zuerst >>> Bar zuerst
drittens: foo >>> drittens: bar
for x in `find . -type f`; do echo ///File $x: ; sed --quiet 's/abc/def/gp' $x; done
sed
Ausdrücke, ich möchte nicht/gp
für jeden einen schreiben . Wie man es global einstellt?Ich denke nicht, dass das möglich ist, aber eine Problemumgehung könnte darin bestehen, stattdessen Perl zu verwenden:
Dadurch werden die geänderten Zeilen auf Standardfehler gedruckt . Beispielsweise:
Sie können dies auch etwas komplexer gestalten, indem Sie die Zeilennummer, den Dateinamen, die ursprüngliche Zeile und die geänderte Zeile drucken:
quelle
$ARGV
für den Namen der Datei verwenden, an der gearbeitet wird.perl
Syntax für einfache Dinge wie diese der Syntax von 's sehr ähnlich ist,sed
und ich glaube nicht, dass das, wonach Sie fragen, tatsächlich möglich istsed
.Es ist möglich, das Flag w zu verwenden, das das aktuelle Muster in eine Datei schreibt. Indem wir es dem Ersetzungsbefehl hinzufügen, können wir aufeinanderfolgende Ersetzungen in einer Datei melden und es drucken, nachdem der Auftrag erledigt ist. Ich mag es auch, die ersetzte Zeichenfolge mit grep einzufärben.
Beachten Sie, dass zwischen dem w und dem Dateinamen nur ein Leerzeichen stehen darf .
Dies ist sogar besser als diff, da Unterschiede auch Änderungen zeigen können, wenn sie nicht von sed erstellt wurden.
quelle
sed.done
. Die Zeilen mit "To" in der Originaldatei werden daher nicht gedrucktsed.done
, so dass Siegrep "To" sed.done
nur die Zeilen sehen, die von geändert werdensed
. Sie werden die ursprüngliche Zeile in der Datei nicht sehen, bevor sie ersetzt wurde, wenn Sie das anstreben ...Ich mag die @ terdon-Lösung - dafür ist Perl gut.
Hier ist meine optimierte Version, die:
Code
Beispielausgabe
quelle