Избегайте строки для шаблона замены sed - PullRequest
281 голосов
/ 02 января 2009

В моем скрипте bash у меня есть внешняя (полученная от пользователя) строка, которую я должен использовать в шаблоне sed.

REPLACE="<funny characters here>"
sed "s/KEYWORD/$REPLACE/g"

Как я могу избежать строки $REPLACE, чтобы она была безопасно принята sed в качестве буквальной замены?

ПРИМЕЧАНИЕ: KEYWORD - немая подстрока без совпадений и т. Д. Она не предоставляется пользователем.

Ответы [ 13 ]

0 голосов
/ 01 июня 2016

Если случается, что вы генерируете случайный пароль для передачи в sed шаблон замены, то вы должны быть осторожны с тем, какой набор символов в случайной строке. Если вы выберете пароль, созданный путем кодирования значения в виде base64, то будет присутствовать только символ, который возможен в base64 и также является специальным символом в sed шаблоне замены. Этот символ «/», и его легко удалить из создаваемого вами пароля:

# password 32 characters log, minus any copies of the "/" character.
pass=`openssl rand -base64 32 | sed -e 's/\///g'`;
0 голосов
/ 22 ноября 2013

не забывайте обо всем удовольствии, которое возникает при ограничении оболочки вокруг "и

т. (В кш)

Var=">New version of \"content' here <"
printf "%s" "${Var}" | sed "s/[&\/\\\\*\\"']/\\&/g' | read -r EscVar

echo "Here is your \"text\" to change" | sed "s/text/${EscVar}/g"
0 голосов
/ 02 января 2009

Вот пример AWK, который я использовал некоторое время назад. Это AWK, который печатает новые AWKS. AWK и SED похожи, это может быть хорошим шаблоном.

ls | awk '{ print "awk " "'"'"'"  " {print $1,$2,$3} " "'"'"'"  " " $1 ".old_ext > " $1 ".new_ext"  }' > for_the_birds

Это выглядит чрезмерно, но почему-то эта комбинация кавычек работает так, чтобы печатать как литералы Тогда, если я правильно помню, переменные просто заключены в такие кавычки: «$ 1». Попробуйте, дайте мне знать, как это работает с SED.

...