Итак, задача состоит в том, чтобы написать sed
подстановку, которая экранирует все специальные символы (определяемые как символы []^$.*/
, и я добавил \
тоже) в строке.
Подстановка может выглядеть так
s/[][\^$.*/]/\\&/g
Обратите внимание, что нам не нужно экранировать ни один из символов в наборе [...]
(\
тоже воспринимается буквально, поэтому мы не можем ничего там экранировать), и что единственное, в чем мы должны быть уверены, это то, что ]
находится в самом начале.
Таким образом, сценарий (переписанный как функция shell и переделанный другими способами) становится
function escape
{
printf '%s\n' "$1" | sed 's/[][\^$.*/]/\\&/g'
}
Тестирование:
$ escape 'hello world'
hello world
$ escape '*.*'
\*\.\*
$ escape '\/'
\\\/
$ escape '/\'
\/\\
$ escape 's/[][\^$.*/]/\\&/g'
s\/\[\]\[\\\^\$\.\*\/\]\/\\\\&\/g