5

特定の行のすべての { } を [ ] に置き換えたいのですが、残念ながら正規表現の最後の出現にしか一致できません。

次のような構造を持つ構成ファイルがあります。

entry {
    id      123456789
    desc    This is a description of {foo} and was added by {bar}
    trigger 987654321
}

私は次のsedを持っています。これは、最後の一致「バー」を置き換えることができますが、「foo」は置き換えることができません:

sed s'/\(desc.*\){\(.*\)}/\1\[\2\]/g' < filename

この検索を「desc」を含む行に固定します。これは、各「entry」ブロックの区切り括弧を置き換えるのが嫌だからです。

私の人生では、すべてのオカレンスを置き換える方法を理解できません。

角膜が割れるのを恐れて、一日中学習しており、これ以上チュートリアルを読むことができません。

ありがとう!

4

1 に答える 1

4

次のことを試してください。

sed '/desc/ s/{\([^}]*\)}/[\1]/g' filename

上記のコマンドの検索と置換は、正規表現に一致する行に対してのみ実行され/desc/ますが、sed は一度に 1 行ずつテキストを処理するため、これは実際には必要ないと思います。 「エントリ」ブロックで。これは、おそらくこれを次のように単純化できることを意味します。

sed 's/{\([^}]*\)}/[\1]/g' filename

.*キャプチャ グループの内側ではなく、右中括弧を除く[^}]*すべてに一致するグループが使用されます。これにより、最初の開始から最後の終了まで一致しなくなります。

また、入力リダイレクトを使用する代わりに、ファイル名を sed の最終引数として指定することもできます。

于 2012-09-27T16:52:21.287 に答える