繁体   English   中英

SED中的多行替换

[英]Multi line replace in SED

我知道有很多关于这个话题的问题。 但我需要案例帮助。 这是我的情景。 我有一个包含以下字符串的文件

TRACE(HELLO_WORLD, GEN, INFO, "Hello world")
TRACE(
    HELLO_WORLD, GEN, INFO, "Hello World")

我想匹配包含HELLO_WORLD所有行,并且在那些行中我想在sed TRACE_CLEANUP TRACE更改为TRACE_CLEANUP

我的sed命令sed -i '/HELLO_WORLD/s/TRACE/TRACE_CLEANUP/g' abc.txt匹配第一种情况,但不匹配第二种情况。

你能帮忙得到正确的命令吗?

谢谢

CHID

$ sed 'H;1h;$!d;x; s/TRACE\(([[:space:]]*HELLO_WORLD\)/TRACE_CLEANUP\1/g' file
TRACE_CLEANUP(HELLO_WORLD, GEN, INFO, "Hello world")
TRACE_CLEANUP(
    HELLO_WORLD, GEN, INFO, "Hello World")

这个怎么运作

  • H;1h;$!d;x;

    这会立即读取整个文件。

    如果您的文件很大(对于内存来说太大),我们会想要一种不同的方法。 如果它不是很大,这种方法很简单。

  • s/TRACE\\(([[:space:]]*HELLO_WORLD\\)/TRACE_CLEANUP\\1/g

    这将查找TRACE(后跟任何空格,后跟HELLO_WORLDHELLO_WORLD中的TRACE_CLEANUP 。最后的g表示此替换是“全局”完成的,意味着需要多次。

Perl解决方案:

perl -e 'undef $/;
         $s = <>;
         $s =~ s/TRACE(\(\s*HELLO_WORLD)/TRACE_CLEANUP$1/g;
         print $s;
        ' input > output
  • undef $/使Perl立即读取整个输入。
  • <>读取输入。
  • s///与sed中的工作方式类似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM