запутался в том, что нужно сбежать за сед - PullRequest
1 голос
/ 01 мая 2020

Я хочу заменить указанные c строки в php файлах автоматически, используя sed. Некоторые работают, а некоторые нет. Я уже исследовал, что это не проблема со строкой замены, а со строкой, которая должна быть заменена. Я уже пытался сбежать [и] безуспешно. Кажется, что это пробел внутри (), а не пробел в целом. Первые пробелы (вокруг =) не имеют никаких проблем. Пожалуйста, кто-нибудь может указать мне на проблему:

sed -e "1,\$s/$adm = substr($path . rawurlencode($upload['name']) , 16);/$adm = rawurlencode($upload['name']); # fix 23/g" -i administration/identify.php

Я уже пытался сократить строку, которую нужно заменить, и в результате я обрезал ее непосредственно за $ path, он работает, со следующим пробелом это не так. Выход из пробелов не имеет никакого эффекта ...

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Вы можете использовать

sed -i 's/\$adm = substr(\$path \. rawurlencode(\$upload\['"'"'name'"'"']) , 16);/$adm = rawurlencode($upload['"'"'name'"'"']); # fix 23/g' administration/identify.php

Примечание:

  • команда sed в основном заключена в одинарные кавычки, расширение переменной не будет происходить внутри одинарных кавычек
  • В синтаксисе POSIX BRE ( соответствует литералу (, вам также не нужно экранировать ), но вам нужно экранировать [ и ., которые должны совпадать с
  • Одиночные кавычки требуют дополнительного цитирования с конкатенацией.
0 голосов
/ 01 мая 2020

что должно быть экранировано для sed

Следующие символы имеют особое значение в sed и должны быть экранированы с \, чтобы регулярное выражение было принято буквально:

  • \
  • [
  • символ, используемый при разделении s частей команды, ie. / здесь
  • .
  • *
  • & только строка замены

Символ новой строки обрабатывается специально как конец строки, но можно заменить на \n.

Так что сначала экранируйте все специальные символы на входе, а затем передайте его в sed:

rgx="$adm = substr($path . rawurlencode($upload['name']) ,  16);"
rgx_escaped=$(sed 's/[\\\[\.\*\/&]/\\&/g' <<<"$rgx")
sed "s/$rgx_escaped/ etc."
...