2016-04-07 70 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