【问题标题】: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()/'

标签: regex linux awk sed grep


【解决方案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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2012-06-06
    • 2013-04-28
    • 2013-07-11
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    相关资源
    最近更新 更多