将 sed 与正则表达式和 (

Use sed with regex and (

我在 php 文件中有一个函数:

_t('', 'Award received')

我做了一个正则表达式,它找到函数的第一部分 _t(''

See Regex in action

现在,我想用其他东西替换那个函数(实际上,我想给函数添加参数)。

来自控制台:

grep -rl "_t('', 'Award received')" application | xargs sed -i "s/_t\s*\(\s*['|\"](\s*\s*)['|\"]/test/g"

Sed 不想进行替换,它说:“( 或 ( 没有一对”,所以看起来它正在尝试在正则表达式中寻找括号...

如何将 sed 与包含方括号的正则表达式一起使用?

编辑: 我有要替换的测试字符串:

_t('124', 'Test')

当我进行简单替换时

sed -i -E 's/124JHGJH/124/g'

它工作正常。

但是如果我尝试用括号和其他替换整个字符串,它就会挂起并且没有响应...

sed -i -E 's/_t\(\'124JHGJH\'/124/g'

注意 sed 正则表达式中 \(( 之间的区别。

要在函数调用结束时添加新参数:

echo "_t('', 'Award received')" | sed 's/_t([^)]\+/&, new_param/'
_t('', 'Award received', new_param)

正则表达式是:

  • -t( = 文字字符
  • [^)]\+ = 一个或多个非)字符

下一个字符将是函数的闭括号,所以我假设您要在此处插入新参数。我在替换中使用 & 将正则表达式匹配的文本放在原处。

如果存在包含右括号字符的字面字符串参数,这将中断。

在带有正则表达式参数的 sed 中使用标记

sed -r 's/(_t[^)]+)(\))/,new_parameter/g'

`(_t[^)]+)` #matches _t and all characters before the last parenthesis. Mark this pattern

(\)) #matches the last parenthesis and mark this pattern

,new_parameter/ #substitute the first marked pattern, then place the new parameter followed by the second pattern marked, which the the last parenthesis

例子

echo "_t('', 'Award received')"|sed -r 's/(_t[^)]+)(\))/,new_parameter/g'

输出

_t('', 'Award received',new_parameter)