我知道有关此主题的问题很多。但我需要案例帮助。这是我的情景。我有一个包含以下字符串的文件
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
答案 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立即读取整个输入。s///
的工作方式与sed相似。