POSIXシェルスクリプトでは、{{
と}}
に囲まれたすべてのテキストを検索し、その中括弧に沿ってテキストをアスタリスクに置き換える必要があります。例えば開始区切り文字と終了区切り文字の間で、テキストに終了区切り文字(つまり貪欲でない一致)が含まれないようにする方法はありますか?
入力が
{{ abc }} def {{ ghi {jkl} mno }} pqr
であれば、出力は私が働く。このためsed
コマンドを思い付くことができていない
* def * pqr
でなければなりません。
私はいくつかのコマンドを試しましたが、動作しません。たとえば、次のコマンドは、sed
が欲張りマッチングを実行するため、目的の出力を生成しません。それはちょうど{{ abc }}
の代わりに{{ abc }} def {{ ghi {jkl} mno }}
と最初のマッチとしてマッチします。
$ echo "{{ abc }} def {{ ghi {jkl} mno }} pqr" | sed 's/{{.*}}/*/g'
* pqr
これはあまり一致しないために機能しない別の例です。文字列のこの部分に}
が含まれているため、{{ ghi {jkl} mno }}
(一致させたい)と一致しません。
$ echo "{{ abc }} def {{ ghi {jkl} mno }} pqr" | sed 's/{{[^}]*}}/*/g'
* def {{ ghi {jkl} mno }} pqr
他にどのようにこのような対応ができますか?
私はNon greedy regex matching in sed?を経ていますが、ここで私は2つの連続した文字の特定のシーケンス、すなわち}}
除く{{
と}}
の間のすべてを一致させたいので、解決策はあり役に立ちません。 1文字以外の区切り文字の間にすべて一致するものを試そうとすると、その質問に対する回答が助けになりました。