Jaki jest cel -e w poleceniu sed?


41

Nie mogę znaleźć żadnej dokumentacji dotyczącej sed -eprzełącznika, dla prostej wymiany, czy go potrzebuję?

na przykład

sed 's/foo/bar/'

VS

sed -e 's/foo/bar/'

14
Czy na pewno tego nie znalazłeś man sed?

4
Nie znajdziesz wyjaśnienia potong, dlaczego nie użyć „cmd1; cmd2”
użytkownik nieznany

Odpowiedzi:


28

Ze strony podręcznika:

-e script, --expression=script

    add the script to the commands to be executed

Możesz więc użyć wielu -eopcji, aby zbudować skrypt z wielu części.

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

Najpierw wymienić fooz bar, a następnie usunąć każdy wiersz zawierający FOO.


3
Więc nie potrzebujesz „-e”, jeśli masz tylko jeden skrypt, prawda?
JohnyTex,

Ja również szukam prawdziwego celu-e
typelogiczny

27

To może Ci pomóc:

sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file

W każdym przypadku polecenia i(wstaw), a(dołącz) i c(zmień) muszą zostać zakończone znakiem nowej linii.

Zwykle polecenia można rozdzielić znakiem ;eg /foo/d;/bar/di pogrupować według {...} eg, /foo/{h;d}ale dla i,a,cpoleceń -ezapewnia sposób ich rozdzielania.

Alternatywą jest użycie powłoki (bash) do wstawienia nowej linii:

sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file

1
Przynajmniej w niektórych implementacjach sed (na przykład we FreeBSD) musisz także kończyć etykiety i komendy rozgałęzienia za pomocą znaku nowej linii / -ezamiast średnika. To nie będzie działać: sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm". Ale to:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
dubiousjim

Nie jestem pewien, jak potrzebna jest must be terminated with a newlinetutaj fraza. Kiedy testowałem w moim cygwin, to działa: sed '/foo/i\bar' file. Teraz, kiedy możemy połączyć oddzielne wyrażenia w jedno, rodzi się ponownie pierwotne pytanie: jaki jest prawdziwy cel tego -e?
typelogic

1

-e, równoważne z --expression, jest opcjonalne, chyba że łączysz kilka wyrażeń razem (niezbyt często), jak pokazano w innej odpowiedzi .

Na bok: ;można użyć zamiast tego w tym samym wyrażeniu, aby wykonać kilka wyrażeń jeden po drugim.


0

W pomocy sedznajdziesz, że -eflaga oznacza:

 -e script, --expression=script
                 add the script to the commands to be executed

Ale nie jesteś pierwszym, który jest zdezorientowany po spotkaniu -e. W przykładzie sed 's/foo/bar/'i sed -e 's/foo/bar/'są równoważne. W obu przypadkach s/foo/bar/jest to skrypt , który jest wykonywany przez sed. Druga opcja jest bardziej wyraźna, ale prawdopodobnie nie jest to powód, dla którego często się ją -estosuje. Powodem tego jest to, -eże można użyć więcej niż jednego skryptu z tym samym wywołaniem sed. Pozostaje pytanie, dlaczego warto go używać, jeśli używa się tylko jednego skryptu? Poniższy przykład może to wyjaśnić:

echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'

Wypisuje „foo”.

Jednak,

echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'

zawiedzie, ponieważ teraz sedinterpretuje pierwszy s/foo/barjako nazwę pliku. Dlatego, aby ułatwić ci życie, możesz już -edziś korzystać z flagi. W ten sposób w przyszłości możesz po prostu dołączyć polecenie za pomocą dodatkowego skryptu, używając -e <script>.

Uwaga: W innych odpowiedziach ;sugerowano użycie jako alternatywy dla używania wielu skryptów. Chociaż jest to technicznie możliwe w niektórych przypadkach, nie jest zalecane, ponieważ szybko prowadzi do bardzo trudnego do odczytania kodu. Zobacz przykład tutaj: https://www.grymoire.com/Unix/Sed.html#uh-61

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.