正则表达式查找/替换不同长度的文本
Posted
技术标签:
【中文标题】正则表达式查找/替换不同长度的文本【英文标题】:Regex to find/replace text of varying length 【发布时间】:2020-09-14 08:01:39 【问题描述】:我们在项目中使用了第三方专有软件。在两个主要版本之间,供应商决定限制对其中一种方法的访问,并提供具有不同签名的替代方法名称。示例如下图
Object obj;
Old way: Method_A(obj);
New way: obj.Method_B();
是否可以在 linux sed 中使用正则表达式进行查找/替换?
例如:
Method_A( abc ); ==> abc .Method_B();强>
Method_A( m ); ==> m .Method_B();强>
Method_A( xyz123 ); ==> xyz123 .Method_B();强>
这是我迄今为止尝试过的:
grep -R "Method_A(" . | sed -i 's/Method_A(^.1,50$/_____.Method_B(/g"
无论我尝试为 _____ 指定什么,我都无法达到预期的结果。
【问题讨论】:
如果()
中有空格,请尝试sed -E 's/Method_A\(([^)]+)\)/\1.Method_B()/' file
和sed -E 's/Method_A\( *([^) ]+) *\)/\1.Method_B()/' file
grep -R "Method_A(" . | sed 's/Method_A([[:space:]]\(.*\)[[:space:]])/\1.Method_B()/'
【参考方案1】:
您可以使用以下 POSIX BRE sed
正则表达式:
sed 's/Method_A( \(.*\) );/\1.Method_B();/g'
如果您需要在 (
和 );
之间应用 1 到 50 个字符,请使用
sed 's/Method_A( \(.\1,50\\) );/\1.Method_B();/g'
详情
Method_A(
- 匹配 Method_A(
子字符串
\(.*\)
- 捕获组 1(在替换模式部分使用 \1
反向引用引用):任意 0 个或更多字符,尽可能多
);
- );
子字符串
查看online sed
demo:
sed 's/Method_A( \(.*\) );/\1.Method_B();/g' <<< 'Method_A( abc );' # ==> abc.Method_B();
sed 's/Method_A( \(.*\) );/\1.Method_B();/g' <<< 'Method_A( m );' # ==> m.Method_B();
sed 's/Method_A( \(.*\) );/\1.Method_B();/g' <<< 'Method_A( xyz123 );' # ==> xyz123.Method_B();
【讨论】:
以上是关于正则表达式查找/替换不同长度的文本的主要内容,如果未能解决你的问题,请参考以下文章