Ich kann keine Dokumentation zum sed
-e
Switch finden. Brauche ich diese zum einfachen Ersetzen?
z.B
sed 's/foo/bar/'
VS
sed -e 's/foo/bar/'
Ich kann keine Dokumentation zum sed
-e
Switch finden. Brauche ich diese zum einfachen Ersetzen?
z.B
sed 's/foo/bar/'
VS
sed -e 's/foo/bar/'
Antworten:
Von der Manpage:
-e script, --expression=script
add the script to the commands to be executed
Sie können also mehrere -e
Optionen verwenden, um ein Skript aus vielen Teilen zu erstellen.
$ sed -e "s/foo/bar/" -e "/FOO/d"
Würde zuerst ersetzen foo
mit bar
und dann enthält jede Zeile löschen FOO
.
-e
Das könnte für Sie funktionieren:
sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file
In jedem Fall müssen die Befehle i
(Einfügen), a
(Anhängen) und c
(Ändern) durch eine neue Zeile abgeschlossen werden.
Normalerweise können Befehle durch ein ;
eg getrennt /foo/d;/bar/d
und durch {...
} eg gruppiert werden, /foo/{h;d}
aber für die i,a,c
Befehle -e
bietet das eine Möglichkeit, die Befehle zu trennen.
Die Alternative besteht darin, die Shell (bash) zu verwenden, um eine neue Zeile einzufügen:
sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file
-e
anstatt mit Semikolons beenden . Das wird nicht funktionieren: sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm"
. Aber das wird:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
must be terminated with a newline
Ausdruck hier bedeutet. Als ich hier getestet in meinem cygwin
, das funktioniert: sed '/foo/i\bar' file
. Nachdem wir nun die einzelnen Ausdrücke zu einem zusammenfassen können, stellt sich erneut die ursprüngliche Frage: Was ist der wahre Zweck von -e
?
-e
, äquivalent zu --expression
, ist optional, es sei denn, Sie setzen mehrere Ausdrücke (nicht allgemein) in einer anderen Antwort zusammen .
Nebenbei: ;
kann stattdessen in einem Ausdruck verwendet werden, um mehrere Ausdrücke nacheinander auszuführen.
In der Hilfe für finden sed
Sie, dass -e
Flagge steht für:
-e script, --expression=script
add the script to the commands to be executed
Aber Sie sind nicht der erste, der nach einer Begegnung verwirrt ist -e
. In deinem Beispiel sed 's/foo/bar/'
und sed -e 's/foo/bar/'
sind gleichwertig. In beiden Fällen s/foo/bar/
handelt es sich um das Skript , das von sed ausgeführt wird. Die zweite Option ist expliziter, aber das ist wahrscheinlich nicht der Grund, den Sie oft sehen -e
. Der Grund dafür ist, -e
dass es möglich ist, mehr als ein Skript mit demselben Aufruf von zu verwenden sed
. Es bleibt die Frage, warum Sie es verwenden, wenn Sie nur ein Skript verwenden. Das folgende Beispiel könnte dies erklären:
echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'
Gibt "foo" aus.
Jedoch,
echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'
schlägt fehl, da jetzt sed
der erste s/foo/bar
als Dateiname interpretiert wird . Um Ihnen das Leben für die Zukunft zu erleichtern, können Sie die -e
Flagge bereits heute verwenden. Auf diese Weise können Sie den Befehl in Zukunft einfach mit einem zusätzlichen Skript anhängen -e <script>
.
NB In anderen Antworten wurde die Verwendung ;
als Alternative zur Verwendung mehrerer Skripte vorgeschlagen. Dies ist zwar in einigen Fällen technisch möglich, wird jedoch nicht empfohlen, da es schnell zu sehr schwer lesbarem Code führt. Ein Beispiel finden Sie hier: https://www.grymoire.com/Unix/Sed.html#uh-61
man sed
?