正規表現の複数行パターンと置換

正規表現の複数行パターンと置換

移行プロセスでは、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

したがって、期待どおりに機能しますが、文字列 "}}"では同じ操作を実行できません。なぜなら予想通りにもっと一致するからです。

次のように実装しようとしています。

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を使用しています。

答え1

以下を試してください。

$ # 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フルファイルをフルルック飲むので、このソリューションは大きすぎる入力ファイルには適していません。
  • .*?貪欲ではないマッチ
  • s修飾子は.改行文字の一致も許可します。

関連情報