Text-Processing
正則表達式多行模式和替換替換
對於遷移過程,我需要在我的 bash 腳本中進行一些替換。
所以在我的 .txt 文件中,我有這些參考資料,例如:
{{Info DOC |author= ME |company= MY COMPANY |classification= RESTRICTED }}
我需要做的是用這種格式編輯所有這些事件:
=== Info DOC === |author= ME |company= MY COMPANY |classification= RESTRICTED
- {{ }} 已刪除。
- === === 添加在第一行。
我試圖做一個是建立 sed 正則表達式來做一個替換
sed -i -e 's/{{Info DOC/=== Info DOC ===/g' test_file.txt
所以,它按預期工作,但 a 不能對字元串 “}}” 做同樣的事情,因為它會按預期匹配更多的東西。
我正在嘗試通過以下方式實現它:
find . -name '*.txt' -exec perl -i -pe 's/{{Info DOC\(.*\)}}/=== Info DOC ===\n\1/g' {} \;
如果您對我有一些線索,那就太好了!謝謝你們 !
**最終解決方案:(**謝謝@Sundeep)
find . -name '*.txt' -exec perl -i -0777 -pe 's/\{\{(Info DOC)(.*?)\}\}\n/=== $1 ===$2/sg' {} \;
PS:我在 MacOS 系統上使用 bash v4
試試這些:
$ # tested on GNU-sed, not sure of syntax for other versions $ sed '/{{Info DOC/,/}}/ { s/{{\(Info DOC\)/=== \1 ===/; /}}/d }' ip.txt === Info DOC === |author= ME |company= MY COMPANY |classification= RESTRICTED
/{{Info DOC/,/}}/
從包含{{Info DOC
的行到包含的行}}
(有關詳細資訊,請參閱範圍地址)
s/{{\(Info DOC\)/=== \1 ===/
根據需要進行轉換/}}/d
刪除這個- 其餘的行不會改變
和
perl
$ perl -0777 -pe 's/\{\{(Info DOC)(.*?)\}\}\n/=== $1 ===$2/sg' ip.txt === Info DOC === |author= ME |company= MY COMPANY |classification= RESTRICTED
-0777
slurp 整個文件,所以這個解決方案不適合太大的輸入文件.*?
非貪婪匹配s
修飾符也允許.
匹配換行符