[英]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_WORLD
和HELLO_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.