在我的 bash 脚本中,我有一个外部(从用户接收的)字符串,我应该在 sed 模式中使用它。
REPLACE="<funny characters here>"
sed "s/KEYWORD/$REPLACE/g"
我怎样才能逃脱$REPLACE
字符串,这样它就会被安全地接受sed
作为字面替代?
NOTE: The KEYWORD
是一个没有匹配项等的哑子字符串。它不是由用户提供的。
Warning: 这确实not考虑换行符。如需更深入的答案,请参阅这个问题 https://stackoverflow.com/questions/29613304/is-it-possible-to-escape-regex-metacharacters-reliably-with-sed反而。 (谢谢,埃德·莫顿 https://stackoverflow.com/a/29626460/4575793和尼克拉斯·彼得)
请注意,逃避一切并不是一个好主意。 sed 需要转义许多字符get他们的特殊意义。例如,如果您转义替换字符串中的数字,它将变成反向引用。
正如 Ben Blank 所说,替换字符串中只有三个字符需要转义(转义本身、用于语句结尾的正斜杠和用于替换全部的 &):
ESCAPED_REPLACE=$(printf '%s\n' "$REPLACE" | sed -e 's/[\/&]/\\&/g')
# Now you can use ESCAPED_REPLACE in the original sed statement
sed "s/KEYWORD/$ESCAPED_REPLACE/g"
如果你需要逃离KEYWORD
字符串,以下是您需要的:
sed -e 's/[]\/$*.^[]/\\&/g'
并且可以被以下人员使用:
KEYWORD="The Keyword You Need";
ESCAPED_KEYWORD=$(printf '%s\n' "$KEYWORD" | sed -e 's/[]\/$*.^[]/\\&/g');
# Now you can use it inside the original sed statement to replace text
sed "s/$ESCAPED_KEYWORD/$ESCAPED_REPLACE/g"
请记住,如果您使用的字符不是/
作为分隔符,您需要将上面表达式中的斜杠替换为您正在使用的字符。请参阅 Peter Claw 的评论以获取解释。
Edited:由于之前未考虑到一些极端情况,上述命令已更改多次。检查编辑历史记录以了解详细信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)