SED中的多行替换

时间:2015-04-02 21:39:06

标签: regex linux bash awk 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匹配第一个案例但不匹配第二个案例。

你能帮忙得到正确的命令。

由于

CHID

2 个答案:

答案 0 :(得分:2)

$ 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_WORLD后面的任何空格,并在TRACE_CLEANUP中替换。最终的g意味着这种替换是在全球范围内完成的,"根据需要多次出现。

答案 1 :(得分:1)

Perl解决方案:

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