我有一些看起来像OldUtility.getList(obj)
的旧代码已被重构为obj.getList()
。我正在尝试编写一个sed
命令,它将正确地重构我的代码。到目前为止,我所拥有的是:
sed -i '' 's/\(OldUtility.getList(\)\(.*\))/\2.getList()/g'
这个问题是它贪婪地抓住了线上的最后一个右括号。这意味着以下情况不起作用:
OldUtility.getList(obj).size()
或
someFunc(OldUtility.getList(obj), otherObj.otherFunc())
但我不希望它不贪婪,因为它还需要处理如下情况:
OldUtility.getList(otherObj.toObj())
- > otherObj.toObj().getList()
所以问题是如何让\2
成为OldUtility.getList(...)
括号内的所有内容?
答案 0 :(得分:2)
如果您不想捕捉右括号,则应使用[^)]*
代替.*
。
经过测试:
echo "OldUtility.getList(otherObj.toObj()) OldUtility.getList(obj).size() someFunc(OldUtility.getList(obj), otherObj.otherFunc())" | sed -E 's/OldUtility.getList.([^)]*)\)([\)]*)/\1\2.getList()/g'
命令为sed -E 's/OldUtility.getList.([^)]*)\)([\)]*)/\1\2.getList()/g'
。
答案 1 :(得分:1)
你让它变得比需要的更复杂。
$ echo "OldUtility.getList(obj)" | sed -r 's/(OldUtility.getList\()[^)]*\)/\1)/'
OldUtility.getList()
我想我误读了参数提取的问题
$ echo "OldUtility.getList(obj)" | sed -r 's/OldUtility(.getList\()([^)]*)\)/\2\1)/'
obj.getList()
最好从搜索模式中捕获字符串值,以消除拼写错误并在一个地方包含值。
看起来我又错过了一次。 这样可以处理另一个级别,但是sed无需前瞻即可处理。
$ echo "OldUtility.getList(otherObj.toObj())" |
sed -r 's/OldUtility(.getList\()([^)]+(\(\))?)/\2\1/'
otherObj.toObj().getList()
答案 2 :(得分:1)
由于getList(...)
可能会多次包含任何级别的嵌套括号,因此您无法使用sed解决此问题(无法知道哪个右括号是好的)。这是一个可以与Perl一起使用的模式(具有匹配嵌套括号的功能):
OldUtility\.getList\(([^()]*+(?:\((?1)\)[^()]*)*+)\)
详细说明:
OldUtility\.getList\( # Note that the literal dot and parenthesis must be escaped
( # open capture group 1
[^()]*+ # all that is not a parenthesis (zero or more)
(?: # open a non capturing group
\((?1)\) # recursion with the capture group 1 subpattern
[^()]*
)*+ # repeat the non-capturing group (zero or more times)
)
\)
示例:
echo 'OldUtility.getList(otherObj.toObj().toString())' | perl -pe 's/OldUtility\.getList\(([^()]*+(?:\((?1)\)[^()]*)*+)\)/$1.getList()/g'