Какова цель -e в команде sed?

42

Я не могу найти документацию о sed -eкоммутаторе, для простой замены, он мне нужен?

например

sed 's/foo/bar/'

В.С.

sed -e 's/foo/bar/'
Говард
источник
14
Вы уверены, что не нашли это в man sed?
4
Вы не найдете объяснений потонгов, почему бы не использовать "cmd1; cmd2"
пользователь неизвестен

Ответы:

29

Со страницы руководства:

-e script, --expression=script

    add the script to the commands to be executed

Таким образом, вы можете использовать несколько -eвариантов для создания сценария из множества частей.

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

Будет ли первый заменить fooс , barа затем удалить каждую строку , содержащую FOO.


источник
3
Итак, вам не нужен '-e', если у вас есть только один скрипт, верно?
JohnyTex
Я тоже ищу истинную цель-e
typelogic
27

Это может работать для вас:

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

В каждом случае команды i(insert), a(append) и c(change) должны заканчиваться символом новой строки.

Обычно команды могут быть разделены, ;например, /foo/d;/bar/dи сгруппированы, {...например,} /foo/{h;d}но для i,a,cкоманд -eпредусмотрен способ разделения команд.

Альтернативой является использование оболочки (bash) для вставки новой строки:

sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file
lcd047
источник
1
По крайней мере, в некоторых реализациях sed (например, во FreeBSD) вам также нужно заканчивать метки и команды ветвления с помощью символов новой строки / -e, а не точек с запятой. Это не сработает sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm". Но это будет:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
dubiousjim
Я не уверен, насколько необходима здесь эта must be terminated with a newlineфраза. Когда я тестировал здесь в моем cygwin, это работает: sed '/foo/i\bar' file. Итак, теперь, когда мы можем объединить отдельные выражения в одно, это снова поднимает вопрос: какова истинная цель -e?
typelogic
1

-eЭквивалентно --expression, является необязательным, если вы не объединяете несколько выражений (не часто), как показано в другом ответе .

В сторону: ;вместо этого можно использовать одно и то же выражение для выполнения нескольких выражений одно за другим.

flow2k
источник
0

В справке sedвы найдете, что -eфлаг обозначает:

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

Но вы не первый, кто запутался после встречи -e. В вашем примере sed 's/foo/bar/'и sed -e 's/foo/bar/'эквивалентны. В обоих случаях s/foo/bar/это скрипт, который выполняется sed. Второй вариант более явный, но это, вероятно, не та причина, которую вы часто -eиспользуете. Причина этого в том, что -eпозволяет использовать более одного сценария с одним и тем же вызовом sed. Это все еще оставляет вопрос, зачем его использовать, если вы используете только один скрипт? Следующий пример может объяснить это:

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

Будет выводить "фу".

Тем не мение,

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

потерпит неудачу, потому что теперь sedинтерпретирует первое s/foo/barкак имя файла. Следовательно, чтобы облегчить жизнь будущему вам, вы уже можете начать использовать -eфлаг сегодня. Таким образом, в будущем вы можете просто добавить команду с помощью дополнительного сценария, используя -e <script>.

NB. В других ответах предлагается использовать ;в качестве альтернативы использование нескольких сценариев. Хотя это технически возможно в некоторых случаях, это не поощряется, потому что это быстро приводит к очень трудно читаемому коду. Смотрите пример здесь: https://www.grymoire.com/Unix/Sed.html#uh-61

BakaKuna
источник