В Mac OS X (с использованием FreeBSD sed):
# replace each newline with a space
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g; ta'
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g' -e ta
Для этого типа проблемы с цитированием вы можете выполнить одно из следующих действий:
#!/bin/sh
SED_ARG="-e 's/SOMETHING//g'"
echo SOMETHING | eval sed "$SED_ARG"
echo SOMETHING | sed $SED_ARG
Что происходит в вашей версии, оболочка вызывает sed с одним аргументом (строка "-e 's / SOMETHING // g '"), но вы хотите, чтобы sed вызывался с двумя аргументами (" -e "и"' s / SOMETHING // g '"). Eval заставляет оболочку интерпретировать строку так, как вы хотите, поскольку не цитирует аргумент, поэтому происходит разделение слов. Обратите внимание, что такие вещи довольно хрупкие.
Передача аргументов в сценарий sed демонстрируется на примере записи grep
.
#!/bin/sh
#File: sedgrep
sed -n 's/'"$1"'/&/p'
grep может выполняться как,
sedgrep '[A-Z][A-Z]' <file
Удалите одинарные кавычки из значения EMAIL
.
EMAIL="-e s/SOMETHING//g"
У меня это сработало (заключите в двойные кавычки):
env | sed -n /"$USERNAME"/p
удалите одинарные кавычки, и все должно работать нормально
Поместите все в одинарные кавычки и позвольте оболочке вычислить это позже, когда оно будет использовано.
EMAIL='-e s/bar@baz.com//g'
EMAIL2='-e s/foo@bar.com//g;s/foo@bar.org//g'
echo "foo@bar.com foo@bar.org foo@baz.com bar@baz.com" | sed $EMAIL $EMAIL2