В каждом случае команды 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
По крайней мере, в некоторых реализациях 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, является необязательным, если вы не объединяете несколько выражений (не часто), как показано в другом ответе .
В сторону: ;вместо этого можно использовать одно и то же выражение для выполнения нескольких выражений одно за другим.
-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
man sed
?Ответы:
Со страницы руководства:
Таким образом, вы можете использовать несколько
-e
вариантов для создания сценария из множества частей.Будет ли первый заменить
foo
с ,bar
а затем удалить каждую строку , содержащуюFOO
.источник
-e
Это может работать для вас:
В каждом случае команды
i
(insert),a
(append) иc
(change) должны заканчиваться символом новой строки.Обычно команды могут быть разделены,
;
например,/foo/d;/bar/d
и сгруппированы,{...
например,}/foo/{h;d}
но дляi,a,c
команд-e
предусмотрен способ разделения команд.Альтернативой является использование оболочки (bash) для вставки новой строки:
источник
-e
, а не точек с запятой. Это не сработаетsed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm"
. Но это будет:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
must be terminated with a newline
фраза. Когда я тестировал здесь в моемcygwin
, это работает:sed '/foo/i\bar' file
. Итак, теперь, когда мы можем объединить отдельные выражения в одно, это снова поднимает вопрос: какова истинная цель-e
?-e
Эквивалентно--expression
, является необязательным, если вы не объединяете несколько выражений (не часто), как показано в другом ответе .В сторону:
;
вместо этого можно использовать одно и то же выражение для выполнения нескольких выражений одно за другим.источник
В справке
sed
вы найдете, что-e
флаг обозначает:Но вы не первый, кто запутался после встречи
-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источник