数学式で角かっこを角かっこに置き換えて、sedで逆参照を使用します。

数学式で角かっこを角かっこに置き換えて、sedで逆参照を使用します。

逆参照でsedイベントやパターンの発生を参照と同じ回数に変更できますか?

例: 与えられた入力に対して

((23 + 5)(23 + 5))
11 x (2+1) = 11 x 3 = 33
3x(5+2)

逆参照のみを使用して(with[とのすべての項目を置き換える必要があります)(この問題はすでにandを使用して解決されています)。ブラケットの数も異なる場合があります。]sedtrsed

ベストアンサー1

(すべてをand[に変更したい場合は、逆参照)]必要ありません。簡単なtr作業を実行できます。

$ tr '()' '[]' <file
[[23 + 5][23 + 5]]
11 x [2+1] = 11 x 3 = 33
3x[5+2]

またはsed

$ sed 'y/()/[]/' <file
[[23 + 5][23 + 5]]
11 x [2+1] = 11 x 3 = 33
3x[5+2]

逆参照は、入力内の内容をそれ自体でのみ変更できるため、角かっこの間の内容を一致させ、次に角かっこ内の同じ内容に置き換えようとするものとします。ループを使用してこれを行うことができます。

$ sed -E -e ':loop' -e 's/\(([^()]+)\)/[\1]/; tloop' <file
[[23 + 5][23 + 5]]
11 x [2+1] = 11 x 3 = 33
3x[5+2]

ここでは、まずラベルを定義してloopから置き換えます。置換が有効な場合はラベルに戻りますloop。これを使用すると、s/.../.../g重複する一致が見つかりませんが、入れ子の括弧があるたびに重複する一致があるため、これを行う必要があります。

置換は、括弧の中に、またはを含まない空でない文字列をs/\(([^()]+)\)/[\1]/見つけてそれ自体を置き換えますが、周囲の括弧を角括弧で置き換えます。()

入力ラインの場合

((23 + 5)(23 + 5))

これによりsed交換が4回行われます。

  1. ([23 + 5](23 + 5))、最初の内部ブラケットが交換されます。
  2. ([23 + 5][23 + 5])、そして2番目の内部アイテムです。
  3. [[23 + 5][23 + 5]]、そして外層。
  4. 最後の置換は何もしません。ループは終了します。

置換式の最後にフラグを使用すると、上記gの最初の2つのステップが重ならないため、同じ置換で実行されます。


同等の基本正規表現を使用する(読みやすくするために上記の拡張正規表現が使用されます):

sed -e ':loop' -e 's/(\([^()][^()]*\))/[\1]/; tloop' <file

おすすめ記事