正则表达式查找/替换不同长度的文本

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()/' filesed -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();

【讨论】:

以上是关于正则表达式查找/替换不同长度的文本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式查找和替换文本?

正则表达式在Notepad ++中查找/替换多个文本

正则表达式对文本的部分替换

linux shell script 使用正则表达式替换查找文本

正则表达式中的 Eclipse 更改案例查找和替换

R语言-正则表达式1