Я не могу найти документацию о sed
-e
коммутаторе, для простой замены, он мне нужен?
например
sed 's/foo/bar/'
В.С.
sed -e 's/foo/bar/'
Я не могу найти документацию о sed
-e
коммутаторе, для простой замены, он мне нужен?
например
sed 's/foo/bar/'
В.С.
sed -e 's/foo/bar/'
Ответы:
Со страницы руководства:
-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
.
-e
Это может работать для вас:
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
-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
?
В справке 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
man sed
?