Как вы используете переменные 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 заставляет оболочку интерпретировать строку так, как вы хотите, так как не приводит кавычки аргумента, чтобы произошло разделение слов. Обратите внимание, что такого рода вещи довольно хрупкие.
Ответ 2
Передача аргументов в sed script показывает пример записи grep
.
#!/bin/sh
#File: sedgrep
sed -n 's/'"$1"'/&/p'
grep можно сделать как,
sedgrep '[A-Z][A-Z]' <file
Ответ 3
Удалите одинарные кавычки из значения EMAIL
.
EMAIL="-e s/SOMETHING//g"
Ответ 4
удалите одинарные кавычки, и он должен работать просто отлично
Ответ 5
Это сработало для меня (объемный с двойными кавычками):
env | sed -n /"$USERNAME"/p
Ответ 6
Поместите все в одинарные кавычки и дайте оболочке eval позже, когда он будет использоваться.
EMAIL='-e s/[email protected]//g'
EMAIL2='-e s/[email protected]//g;s/[email protected]//g'
echo "[email protected] [email protected] [email protected] [email protected]" | sed $EMAIL $EMAIL2