Nie mogę znaleźć żadnej dokumentacji dotyczącej sed
-e
przełącznika, dla prostej wymiany, czy go potrzebuję?
na przykład
sed 's/foo/bar/'
VS
sed -e 's/foo/bar/'
Nie mogę znaleźć żadnej dokumentacji dotyczącej sed
-e
przełącznika, dla prostej wymiany, czy go potrzebuję?
na przykład
sed 's/foo/bar/'
VS
sed -e 's/foo/bar/'
Odpowiedzi:
Ze strony podręcznika:
-e script, --expression=script
add the script to the commands to be executed
Możesz więc użyć wielu -e
opcji, aby zbudować skrypt z wielu części.
$ sed -e "s/foo/bar/" -e "/FOO/d"
Najpierw wymienić foo
z bar
, a następnie usunąć każdy wiersz zawierający FOO
.
-e
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/d
i pogrupować według {...
} eg, /foo/{h;d}
ale dla i,a,c
poleceń -e
zapewnia 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
-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 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
?
-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.
W pomocy sed
znajdziesz, że -e
flaga 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ą -e
stosuje. 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 sed
interpretuje pierwszy s/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
man sed
?