Как вы используете переменные shell script в качестве аргументов для sed?

Что я хотел бы сделать, это примерно следующее:

#!/bin/sh
EMAIL="-e 's/SOMETHING//g'"

somecommand | sed "$EMAIL"

Но я получаю следующее:

sed: -e expression #1, char 2: unknown command: `''

Я пробовал много вариантов. Я знаю, что это просто вопрос правильной строки. Причина, по которой я хотел бы сделать это, - сломать длинную команду sed для удобочитаемости. Должен ли я просто использовать файл sed script -file (с параметром -f)?

UPDATE:

Мой фактический script немного сложнее:

#!/bin/sh
EMAIL="-e s/SOME THING//g -e s/SOME THING ELSE//g ..."

somecommand | sed "$EMAIL"

После удаления одинарных кавычек я получаю:

sed: -e expression #1, char 18: unknown option to `s'

Ответ 1

Для этого типа проблемы цитирования вы можете сделать одно из:

#!/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 заставляет оболочку интерпретировать строку так, как вы хотите, так как не приводит кавычки аргумента, чтобы произошло разделение слов. Обратите внимание, что такого рода вещи довольно хрупкие.

Ответ 3

Удалите одинарные кавычки из значения EMAIL.

EMAIL="-e s/SOMETHING//g"

Ответ 4

удалите одинарные кавычки, и он должен работать просто отлично

Ответ 5

Это сработало для меня (объемный с двойными кавычками):

 env | sed -n /"$USERNAME"/p