我有一堆.php
文件,我想替换所有出现的字符串。
find: jQuery(function
replace: head.ready(function
我认为我使用以下方法做得正确:
find . -name '*.php' -exec sed -e 's/jQuery[(]function/head.ready[(]function/g' -i'.bak' {} \;
最终发生的事情是它被替换jQuery(function
为head.ready[(]function
我本以为我可以(
通过将其围成块来逃脱[]
,但事实并非如此。
有人有什么建议吗?
答案1
(
不是 sed 正则表达式中的特殊字符。你不需要逃避它。
sed -e 's/jQuery(function/head.ready(function/g'
[(]
正则表达式中的意思是仅包含一个元素的字符集,(
.这是一种复杂的写作方式(
。
[(]
替换文本中的意思是三个字符[(]
。括号在替换文本中没有特殊含义。
如果您愿意,可以通过将函数放在一个组中来避免重复函数名称。组由反斜杠括号分隔。
sed -e 's/jQuery(\(function\)/head.ready(\1/g'
请注意,您的更换也会影响jQuery(functionwithsuffix
。避免这种情况的简单方法是使用能够理解扩展 Perl 正则表达式的工具,这样您就可以(?![^A-Za-z0-9_])
在搜索字符串的末尾使用,意思是“后面跟着不是字母数字字符的内容”。注意,在 Perl 正则表达式中,(
是特殊的,需要在它前面加上反斜杠。
perl -pe 's/jQuery\(function(?![^A-Za-z0-9_])/head.ready(function/g'
perl -pe 's/jQuery\((function)(?![^A-Za-z0-9_])/head.ready($1/g'
答案2
无需转义替换字符串中的括号。
sed -e 's/jQuery[(]function/head.ready(function/g'
答案3
(
是sed 中的特殊字符,如果使用扩展正则表达式(埃雷)。
例如,sed -e
将失败不匹配的错误,当你需要转义圆括号(无论出于何种原因),但运行sed没有指定埃雷:
$ regex="\("; echo "...(..." | sed 's/'$regex'/_/g'
sed: -e expression #1, char 8: Unmatched ( or \(
$ regex="\("; echo "...(..." | sed -e 's/'$regex'/_/g'
sed: -e expression #1, char 8: Unmatched ( or \(
在这种情况下,您必须将 sed 与-E
选项(或-r
, --regexp-extended
)一起使用:
$ regex="\("; echo "...(..." | sed -E 's/'$regex'/_/g'
..._...
$ regex="\("; echo "...(..." | sed -r 's/'$regex'/_/g'
..._...