如何在替换文本中正确使用sed中捕获的组?

时间:2015-02-02 20:58:24

标签: sed

仅仅没有足够的sed用户能够解决这个问题。我尝试将下划线转换为lodash,这需要将许多调用从_(obj).method()更改为_.method(obj)。我一直试图用sed这样做:

sed "s/_(\(.*\)).\(.*\)(/_.\2(\1, /"

这种模式实际上适用于一行中的单个实例。 E.g。

echo "_(foo).bar('blah')" | sed "s/_(\(.*\)).\(.*\)(/_.\2(\1, /"

实际输出预期结果:_.bar(foo, 'blah')。问题是当一行出现多次时。 E.g。

echo "_(foo).bar('baz') yep _(baz).quux('blah')" | sed "s/_(\(.*\)).\(.*\)(/_.\2(\1, /"

输出_.quux(foo).bar('baz') yep _(baz, 'blah')

echo "_(foo).bar('baz') yep _(baz).quux('blah')" | sed "s/_(\([^(]*\)).\(.*\)(/_.\2(\1, /"

输出_.bar('baz') yep _(baz).quux(foo, 'blah')

所以,我显然不明白如何在替换文本中使用捕获组。顺便说一句,在最后添加/g并不能解决这个问题。

1 个答案:

答案 0 :(得分:2)

这就是你要找的东西吗?

sed -r 's/_\(([^)]*)\)\.([^(]*\()([^)]*\))/_.\2\1,\3/g'

以你的例子:

kent$  echo "_(foo).bar('baz') yep _(baz).quux('blah')" | sed -r 's/_\(([^)]*)\)\.([^(]*\()([^)]*\))/_.\2\1,\3/g'
_.bar(foo,'baz') yep _.quux(baz,'blah')

更新,对您的代码的评论:

我看了你的代码,做了一些修改,现在它在这里工作。

Yours : sed "s/_(\([^(]*\)).\(.*\)(/_.\2(\1, /"
Mine  : sed "s/_(\([^)]*\))\.\([^(]*\)(/_.\2(\1, /g"
  • 请记住,sed总是贪婪匹配,所以,你必须使用[^something]。检查我改变的地方。
  • dot(.)如果希望与文字.匹配,则应对其进行转义。
  • 需要
  • g标志