仅仅没有足够的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
并不能解决这个问题。
答案 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"
[^something]
。检查我改变的地方。.
)如果希望与文字.
匹配,则应对其进行转义。g
标志