我有一个文本文件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”
您能帮我解决以上命令的问题吗?
问题是,它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
打印整个图案空间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句