Text-Processing

正則表達式多行模式和替換替換

  • April 5, 2018

對於遷移過程,我需要在我的 bash 腳本中進行一些替換。

所以在我的 .txt 文件中,我有這些參考資料,例如:

{{Info DOC
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
}}

我需要做的是用這種格式編輯所有這些事件:

=== Info DOC ===
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
  1. {{ }} 已刪除。
  2. === === 添加在第一行。

我試圖做一個是建立 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
  • -0777slurp 整個文件,所以這個解決方案不適合太大的輸入文件
  • .*?非貪婪匹配
  • s修飾符也允許.匹配換行符

引用自:https://unix.stackexchange.com/questions/435708