Was ist der Zweck von -e in sed command?

41

Ich kann keine Dokumentation zum sed -eSwitch finden. Brauche ich diese zum einfachen Ersetzen?

z.B

sed 's/foo/bar/'

VS

sed -e 's/foo/bar/'
Howard
quelle
14
Bist du sicher, dass du das nicht gefunden hast man sed?
4
Sie finden keine Erklärung für Potongs, warum nicht "cmd1; cmd2" verwenden
Benutzer unbekannt

Antworten:

28

Von der Manpage:

-e script, --expression=script

    add the script to the commands to be executed

Sie können also mehrere -eOptionen verwenden, um ein Skript aus vielen Teilen zu erstellen.

$ sed -e "s/foo/bar/" -e "/FOO/d"

Würde zuerst ersetzen foomit barund dann enthält jede Zeile löschen FOO.


quelle
3
Sie brauchen also kein '-e', wenn Sie nur ein Skript haben, oder?
JohnyTex
Auch ich -e
suche
27

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/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
lcd047
quelle
1
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.

flow2k
quelle
0

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

BakaKuna
quelle