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/dund durch {...} eg gruppiert werden, /foo/{h;d}aber für die i,a,cBefehle -ebietet 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
In mindestens einigen sed-Implementierungen (zum Beispiel in FreeBSD) müssen Sie Labels und Verzweigungsbefehle auch mit newlines / -eanstatt 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"
dubiousjim
Ich bin mir nicht sicher, wie notwendig der must be terminated with a newlineAusdruck 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?
typelogic
1
-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 sedSie, dass -eFlagge 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, -edass 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 sedder erste s/foo/barals Dateiname interpretiert wird . Um Ihnen das Leben für die Zukunft zu erleichtern, können Sie die -eFlagge 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
?Antworten:
Von der Manpage:
Sie können also mehrere
-e
Optionen verwenden, um ein Skript aus vielen Teilen zu erstellen.Würde zuerst ersetzen
foo
mitbar
und dann enthält jede Zeile löschenFOO
.quelle
-e
Das könnte für Sie funktionieren:
In jedem Fall müssen die Befehle
i
(Einfügen),a
(Anhängen) undc
(Ä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 diei,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:
quelle
-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 meinemcygwin
, 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.quelle
In der Hilfe für finden
sed
Sie, dass-e
Flagge steht für:Aber Sie sind nicht der erste, der nach einer Begegnung verwirrt ist
-e
. In deinem Beispielsed 's/foo/bar/'
undsed -e 's/foo/bar/'
sind gleichwertig. In beiden Fällens/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 verwendensed
. 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 erstes/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-61quelle