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," 意味着需要多少次。
我知道有很多关于这个主题的问题。但我需要个案帮助。这是我的场景。我有一个包含以下字符串的文件
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," 意味着需要多少次。