如何使用带圆括号的 sed?

如何使用带圆括号的 sed?

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

find: jQuery(function
replace: head.ready(function

我认为我使用以下方法做得正确:

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

最终发生的事情是它被替换jQuery(functionhead.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'
..._...

相关内容