多线替换为sed - Linux / Ubuntu

时间:2016-04-07 09:38:58

标签: linux bash sed

原始文件如下所示:

BLABLA ABCABC blabl=
a blabla blabla ABC=
ABC blabla blabla A=
BCABC blabla

结果如下:

BLABLA DEFDEF blabl=
a blabla blabla DEF=
DEF blabla blabla D=
EFDEF blabla

所有ABCABC都应该被DEFDEF替换,即使单词中有换行符(标有=)。

是否可以使用sed?

4 个答案:

答案 0 :(得分:2)

用于在任意位置连字ABCABC的Sed多线:

$ sed -r 'N;s/A(=\n)?B(=\n)?C(=\n)?A(=\n)?B(=\n)?C/D\1E\2F\3D\4E\5F/g;P;D' infile
BLABLD AEFDEF blabl=
a blabla blabla DEF=
DEF blabla blabla D=
EFDEF blabla

N;P;D是在模式空间中一次保留两行的惯用方法。替换检查ABCABC可选地穿插=并在任何位置添加换行符,并且替换会插回所捕获的内容。

这需要-E运算符的扩展正则表达式(BSD sed中为?)。但是,GNU sed支持BRE中的\?作为扩展名,但所有()也必须进行转义。

如果=只是符号换行符并且实际上并不存在,则会简化为

$ sed -r 'N;s/A(\n?)B(\n?)C(\n?)A(\n?)B(\n?)C/D\1E\2F\3D\4E\5F/g;P;D' infile
BLABLA DEFDEF blabl
a blabla blabla DEF
DEF blabla blabla D
EFDEF blabla

答案 1 :(得分:0)

嗯,它不是多线,但解决了你的例子:

sed -r -e 's/ABC/DEF/g' -e 's/AB=/DE=/g' -e 's/A=/D=/g' -e 's/^BC/EF/g' -e 's/^C/F/g' infile

答案 2 :(得分:0)

试试这个,

sed -i -e "s/ABC/DEF/g;s/A/D/g;s/B/E/g;s/C/F/g" filename.txt

答案 3 :(得分:0)

Using gnu awk with null RS you can do this in single replacement (using gensub):

awk -v RS= '{
   print gensub(/A(=\n)?B(=\n)?C(=\n)?A(=\n)?B(=\n)?C/, "D\\1E\\2F\\3D\\4E\\5F", "g", $0)
}' file

Output:

BLABLA DEFDEF blabl=
a blabla blabla DEF=
DEF blabla blabla D=
EFDEF blabla