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
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.
-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
man sed
?Odpowiedzi:
Ze strony podręcznika:
Możesz więc użyć wielu
-e
opcji, aby zbudować skrypt z wielu części.Najpierw wymienić
foo
zbar
, a następnie usunąć każdy wiersz zawierającyFOO
.źródło
-e
To może Ci pomóc:
W każdym przypadku polecenia
i
(wstaw),a
(dołącz) ic
(zmień) muszą zostać zakończone znakiem nowej linii.Zwykle polecenia można rozdzielić znakiem
;
eg/foo/d;/bar/d
i pogrupować według{...
} eg,/foo/{h;d}
ale dlai,a,c
poleceń-e
zapewnia sposób ich rozdzielania.Alternatywą jest użycie powłoki (bash) do wstawienia nowej linii:
źródło
-e
zamiast ś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"
must be terminated with a newline
tutaj fraza. Kiedy testowałem w moimcygwin
, 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
?-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.źródło
W pomocy
sed
znajdziesz, że-e
flaga oznacza:Ale nie jesteś pierwszym, który jest zdezorientowany po spotkaniu
-e
. W przykładziesed 's/foo/bar/'
ised -e 's/foo/bar/'
są równoważne. W obu przypadkachs/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ą-e
stosuje. Powodem tego jest to,-e
że można użyć więcej niż jednego skryptu z tym samym wywołaniemsed
. 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
sed
interpretuje pierwszys/foo/bar
jako nazwę pliku. Dlatego, aby ułatwić ci życie, możesz już-e
dziś 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źródło