SED 中的多行替换

Multi line replace in SED

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

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

我想匹配所有包含 HELLO_WORLD 的行,在这些行中我想在 sed 中将 TRACE 更改为 TRACE_CLEANUP

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

能否请您帮忙获取正确的命令。

谢谢

孩子

Perl 解决方案:

perl -e 'undef $/;
         $s = <>;
         $s =~ s/TRACE(\(\s*HELLO_WORLD)/TRACE_CLEANUP/g;
         print $s;
        ' input > output
  • undef $/ 让 Perl 一次读取整个输入。
  • <> 读取输入。
  • s/// 与 sed 中的工作方式类似。
$ sed 'H;1h;$!d;x; s/TRACE\(([[:space:]]*HELLO_WORLD\)/TRACE_CLEANUP/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/g

    这将查找 TRACE( 后跟任何空格后跟 HELLO_WORLD 并替换 TRACE_CLEANUP。最后的 g 表示此替换已完成 "globally," 意味着需要多少次。