2016-04-07 50 views
1

原始文件看起来是这样的:多行替换sed的 - 的Linux/Ubuntu的

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 

因此,所有ABCABCDEFDEF更换,即使有换行符(标记为=)。

sed可以吗?

+0

用Perl尝试:http://stackoverflow.com/questions/3365260/match -and-取代-多换行符上带有一个-沉渣 - 或-perl的酮衬垫 – Heinz

回答

2

桑达多,对于在任意的位置连字符ABCABC作品:

$ 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可选地穿插=和换行符在任何位置,并且替换插回被捕获的内容。

对于?运算符,这需要扩展正则表达式(在BSD sed中为-E)。虽然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 
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 
0

试试这个,

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

使用了GNU AWK与空RS您可以(使用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 

输出:

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