簡體   English   中英

用sed替換多行-Linux / Ubuntu

[英]Multiline replace with 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

因此,即使單詞中有換行符(用=標記),所有ABCABC都應替換為DEFDEF

sed有可能嗎?

sed多行,用於在任意位置將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

好吧,它不是多行的,但是可以解決您的示例:

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

嘗試這個,

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

將gnu awk與null 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM