如何使用带圆括号的 sed?

Teg*_*der 5 sed

我有一堆.php文件要替换所有出现的字符串。

find: jQuery(function
replace: head.ready(function
Run Code Online (Sandbox Code Playgroud)

我认为我使用以下方法是正确的:

find . -name '*.php' -exec sed -e 's/jQuery[(]function/head.ready[(]function/g' -i'.bak' {} \;
Run Code Online (Sandbox Code Playgroud)

最终发生的是它被替换jQuery(functionhead.ready[(]function

我以为我可以(通过将它封闭在块中来逃避它,[]但事实并非如此。

有人有什么建议吗?

Gil*_*il' 13

(不是 sed 正则表达式中的特殊字符。你不需要逃避它。

sed -e 's/jQuery(function/head.ready(function/g'
Run Code Online (Sandbox Code Playgroud)

[(]在正则表达式中表示只包含一个元素的字符集,(。这是一种复杂的写作方式(

[(]在替换文本中表示三个字符[(]。括号在替换文本中没有特殊含义。

如果您愿意,可以通过将其放在一个组中来避免重复函数名称。组由反斜杠括号分隔。

sed -e 's/jQuery(\(function\)/head.ready(\1/g'
Run Code Online (Sandbox Code Playgroud)

请注意,您的更换也会影响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'
Run Code Online (Sandbox Code Playgroud)