我有一个文本文件file.log包含以下文本
file.log
ab
cd
ef
我想替换" ab \ ncd"用" ab \ n"最终的file.log应如下所示:
ab
ef
这是我正在使用的sed命令,但它无法识别换行符以匹配该模式:
sed -i 's/\(.*\)\r \(.*\)/\1\r/g' file.log
在' \ r'之后有3个字符的空格但是没有改变。
\(.*\)
- 这匹配任何字符(。)后跟前面字符的0或更多(*)
\r
- 换行
\1
- 第一个匹配模式的替换。在这种情况下,它是' ab'
你能帮助我解决上述命令的错误吗?
答案 0 :(得分:1)
Sed逐行处理输入文件。所以不能像上面那样做。您需要包含N
,以便将下一行附加到模式空间中。
$ sed 'N;s~ab\ncd~ab\n~g' file
ab
ef
答案 1 :(得分:1)
问题在于,sed
是一个流编辑器,它从输入文件中逐行读取
所以当它读取行
时ab
从输入文件中,它不知道该行后面是否有一行
cd
当它读取行cd
时,它将从模式空间中删除行ab
,这使得模式对当前模式空间无效。
<强>解决方案强>
解决方案可以是读取整个文件,并将它们附加到保留空间,然后替换保留空间。如
$ sed -n '1h; 1!H;${g;s/ab\ncd/ab\n/g;p}' input
ab
ef
它的作用
1h
将第一行复制到保留空间。
1!H
所有行都是第一行(1!
),将该行附加到保留空间。
$
与最后一行匹配,执行{..}
g
将保留空间的内容复制回模式空间
s/ab\ncd/ab\n/g
进行替换。
p
打印整个模式空间。
答案 2 :(得分:0)
其他几个选项:
perl -i -0pe 's/^ab\n\Kcd$//mg' file.log
将更改文件中的任何此类模式
如果只有一个,那么好ed
ed file.log <<END_SCRIPT
/^ab$/+1 c
.
wq
END_SCRIPT