在我的bash脚本中,我有一个外部(从用户接收)字符串,我应该在sed模式中使用。
REPLACE="<funny characters here>"
sed "s/KEYWORD/$REPLACE/g"
我如何转义$REPLACE字符串,以便它被sed安全地接受为文字替换?
注意:KEYWORD是一个哑子字符串,没有匹配等。不是用户提供的。
在我的bash脚本中,我有一个外部(从用户接收)字符串,我应该在sed模式中使用。
REPLACE="<funny characters here>"
sed "s/KEYWORD/$REPLACE/g"
我如何转义$REPLACE字符串,以便它被sed安全地接受为文字替换?
注意:KEYWORD是一个哑子字符串,没有匹配等。不是用户提供的。
当前回答
不要忘记所有的快乐发生在壳的限制'和'
所以(ksh)
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"
其他回答
更简单的方法是预先构建字符串,并将其用作sed的参数
rpstring="s/KEYWORD/$REPLACE/g"
sed -i $rpstring test.txt
如果您只是想替换sed命令中的变量值,那么只需删除 例子:
sed -i 's/dev-/dev-$ENV/g' test to sed -i s/dev-/dev-$ENV/g test
看来你问错问题了。我也问错了问题。错误的原因是第一句话的开头:“在我的bash脚本中…”。
我也有同样的问题,犯了同样的错误。如果您正在使用bash,则不需要使用sed来进行字符串替换(使用bash中内置的替换特性要干净得多)。
而不是像这样,例如:
function escape-all-funny-characters() { UNKNOWN_CODE_THAT_ANSWERS_THE_QUESTION_YOU_ASKED; }
INPUT='some long string with KEYWORD that need replacing KEYWORD.'
A="$(escape-all-funny-characters 'KEYWORD')"
B="$(escape-all-funny-characters '<funny characters here>')"
OUTPUT="$(sed "s/$A/$B/g" <<<"$INPUT")"
你可以专门使用bash特性:
INPUT='some long string with KEYWORD that need replacing KEYWORD.'
A='KEYWORD'
B='<funny characters here>'
OUTPUT="${INPUT//"$A"/"$B"}"
以下是我找到的转义码:
* = \x2a
( = \x28
) = \x29
" = \x22
/ = \x2f
\ = \x5c
' = \x27
? = \x3f
% = \x25
^ = \x5e
sed命令允许你使用其他字符代替/作为分隔符:
sed 's#"http://www\.fubar\.com"#URL_FUBAR#g'
双引号不是问题。