使用sed替换模式

3
我想替换一个类似以下的模式:
make_pair(obj1.get<1>(), obj2.get<2>());

to:

make_pair(get<1>(obj1), get<2>(obj2));

尝试使用命令:sed -i'' -e 's/(\(.*\)./get<1>(\1)/g' file_name,但结果错误。如何捕获模式之前的标记?请注意,它还应该适用于字符串make_pair(obj1[I].get<1>(), obj2[I].get<2>());

括号和方括号可以嵌套吗?如果没有嵌套的括号,请使用sed -i'' -E 's/([[:alnum:]_]*)\.get(<[^><]*>)\(\)/get\2(\1)/g' filename。请参见demo - Wiktor Stribiżew
谢谢,如果没有嵌套括号,它可以工作。如果使用obj[I].get<1>(),需要进行哪些更改? - noOne
好的,但是你的脚本对于 make_pair(obj1[I].get<1>(), obj2[I].get<2>()) 不起作用。你能检查一下吗? - noOne
Try https://ideone.com/QDJMz1 - Wiktor Stribiżew
运行良好。谢谢! - noOne
显示剩余3条评论
2个回答

2

你可以使用

sed -i'' -E 's/([[:alnum:]]*(\[[[:alnum:]]*])*)\.get(<[^><]*>)\(\)/get\3(\1)/g'  filename

POSIX ERE模式详解

  • ([[:alnum:]]*(\[[[:alnum:]]*])*) - 第1组:
    • [[:alnum:]]* - 0个或多个字母数字字符
    • (\[[[:alnum:]]*])* - 0个或多个重复的
      • \[ - 一个[字符
      • [[:alnum:]]* - 0个或多个字母数字字符
      • ] - 一个]字符。
  • \.get - 一个.get子字符串
  • (<[^><]*>) - 第3组:一个<,然后是0个或多个不是<>的字符,最后是>
  • \(\) - 一对空括号()

在线演示

s="make_pair(obj1[I].get<1>(), obj2[I].get<2>());"
sed -E 's/([[:alnum:]]*(\[[[:alnum:]]*])*)\.get(<[^><]*>)\(\)/get\3(\1)/g' <<< "$s"
# => make_pair(get<1>(obj1[I]), get<2>(obj2[I]));

1
请试一下这个,请看看它是不是你想要的:
$ cat file_name
make_pair(obj1.get<1>(), obj2.get<2>());

$ sed -e 's/\([[:alnum:]]*\)\.\([[:alnum:]<>]*\)()/\2.(\1)/g' file_name
make_pair(get<1>.(obj1), get<2>.(obj2));

我移除了-i''开关,如果你发现结果正确,请将其添加回来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接