Ale*_*ysh 296 string escaping sed
在我的bash脚本中,我有一个外部(从用户接收)字符串,我应该在sed模式中使用它.
REPLACE="<funny characters here>"
sed "s/KEYWORD/$REPLACE/g"
Run Code Online (Sandbox Code Playgroud)
如何逃避$REPLACE
字符串,以便sed
作为文字替代品安全地接受?
注意:这KEYWORD
是一个没有匹配等的哑子串.它不是由用户提供的.
Pia*_*rus 248
警告:这并没有考虑换行.有关更深入的答案,请参阅此SO问题.(谢谢,Ed Morton和Niklas Peter)
请注意,逃避一切都是一个坏主意.Sed需要转义许多字符以获得它们的特殊含义.例如,如果您转义替换字符串中的数字,它将转入反向引用.
正如Ben Blank所说,在替换字符串中只需要转义三个字符(转义自身,正斜杠表示结束语句和&替换全部):
sed -e 's/[\/&]/\\&/g'
Run Code Online (Sandbox Code Playgroud)
如果您需要转义KEYWORD
字符串,则需要以下内容:
sed -e 's/[]\/$*.^[]/\\&/g'
Run Code Online (Sandbox Code Playgroud)
请记住,如果您使用的字符不是/
分隔符,则需要使用您正在使用的字符替换上面表达式中的斜杠.请参阅PeterJCLaw的评论以获得解释.
编辑:由于以前没有考虑到一些角落情况,上面的命令已经改变了好几次.检查编辑历史记录以获取详细信
scr*_*www 85
sed命令允许您使用其他字符而不是/
分隔符:
sed 's#"http://www\.fubar\.com"#URL_FUBAR#g'
Run Code Online (Sandbox Code Playgroud)
双引号不是问题.
Ben*_*ank 44
在replace子句中专门处理的唯一三个文字字符是/
(关闭子句),\
(转义字符,反向引用和&c.),以及&
(在替换中包括匹配).因此,您需要做的就是逃避这三个字符:
sed "s/KEYWORD/$(echo $REPLACE | sed -e 's/\\/\\\\/g; s/\//\\\//g; s/&/\\\&/g')/g"
Run Code Online (Sandbox Code Playgroud)
例:
$ export REPLACE="'\"|\\/><&!"
$ echo fooKEYWORDbar | sed "s/KEYWORD/$(echo $REPLACE | sed -e 's/\\/\\\\/g; s/\//\\\//g; s/&/\\\&/g')/g"
foo'"|\/><&!bar
Run Code Online (Sandbox Code Playgroud)
Gur*_*ngh 33
基于Pianosaurus的正则表达式,我创建了一个bash函数,它可以逃避关键字和替换.
function sedeasy {
sed -i "s/$(echo $1 | sed -e 's/\([[\/.*]\|\]\)/\\&/g')/$(echo $2 | sed -e 's/[\/&]/\\&/g')/g" $3
}
Run Code Online (Sandbox Code Playgroud)
以下是您使用它的方式:
sedeasy "include /etc/nginx/conf.d/*" "include /apps/*/conf/nginx.conf" /etc/nginx/nginx.conf
Run Code Online (Sandbox Code Playgroud)
use*_*464 16
回复有点迟了......但有一种更简单的方法可以做到这一点.只需更改分隔符(即分隔字段的字符).所以,而不是s/foo/bar/
你写s|bar|foo
.
而且,这是简单的方法:
sed 's|/\*!50017 DEFINER=`snafu`@`localhost`\*/||g'
Run Code Online (Sandbox Code Playgroud)
结果输出没有那个令人讨厌的DEFINER子句.
des*_*son 11
原来你问的是错误的问题.我也问了一个错误的问题.它错误的原因是第一句话的开头:"在我的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")"
Run Code Online (Sandbox Code Playgroud)
你可以专门使用bash功能:
INPUT='some long string with KEYWORD that need replacing KEYWORD.'
A='KEYWORD'
B='<funny characters here>'
OUTPUT="${INPUT//"$A"/"$B"}"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
268858 次 |
最近记录: |