Как сохранить аргументы sed в переменной для подстановки параметров в BASH - PullRequest
1 голос
/ 08 мая 2020

Мне нужно сохранить некоторые выражения sed в переменной и подставить их в команду sed.

myArgs="-e 's/foo/bar/' -e 's/foo2/bar2/'"

Пока они не работают:

echo "foo" | sed ${myArgs} 
# sed: -e expression #1, char 1: unknown command: `''

echo "foo" | sed  $(echo ${myArgs})
# sed: -e expression #1, char 1: unknown command: `''

echo ${myArgs}
's/foo/bar/' -e 's/foo2/bar2/'
# 1st -e missing

Расширение параметра интерпретирует первый аргумент -e в переменной.

-e может интерпретироваться как проверка на существование или аргумент для echo.

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

Чтобы уточнить , это просто упрощенная версия команды, которая будет содержать большое количество выражений sed с символами, которые требуют экранирования в регулярном выражении, и я бы предпочел оставить выражения, указанные в кавычках, как есть, и выгружать все выражения sed в команду sed как единую переменную.

Если это невозможно, я буду использовать другой метод, такой как текущие ответы ниже, однако кажется, что должен быть какой-то встроенный метод bash, чтобы не расширять переменную заранее , а вместо этого просто интерпретируйте его как строку, прежде чем она будет использована в последней команде sed.

Фактические аргументы, которые я использую, будут выглядеть примерно так:

-e 's/^>chr1.*/>NC_032089.1_chr1/' -e 's/^>chr2.*/>NC_032090.1_chr2/'

С неизвестными строками

Ответы [ 2 ]

3 голосов
/ 08 мая 2020

Не используйте строку, используйте массив:

myArgs=("-e" "s/foo/bar/" "-e" "s/foo2/bar2/")
sed "${myArgs[@]}" <<< "foo"
1 голос
/ 09 мая 2020

Поскольку мы знаем ввод, а код sed достаточно безопасен, можно использовать eval здесь:

echo foo | eval sed $myArgs

Вывод:

bar

Связанный вопрос о вещах, которых следует опасаться: Почему следует избегать eval в Bash и что я должен использовать вместо этого?

Mo Столбец Sunworld в Budlong Психология командной строки 101 - это самая полезная вещь, которую я видел для понимания синтаксического анализа командной строки.

...