逆参照でsed
イベントやパターンの発生を参照と同じ回数に変更できますか?
例: 与えられた入力に対して
((23 + 5)(23 + 5))
11 x (2+1) = 11 x 3 = 33
3x(5+2)
逆参照のみを使用して(
with[
とのすべての項目を置き換える必要があります)
(この問題はすでにandを使用して解決されています)。ブラケットの数も異なる場合があります。]
sed
tr
sed
答え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回行われます。
([23 + 5](23 + 5))
、最初の内部ブラケットが交換されます。([23 + 5][23 + 5])
、そして2番目の内部アイテムです。[[23 + 5][23 + 5]]
、そして外層。- 最後の置換は何もしません。ループは終了します。
置換式の最後にフラグを使用すると、上記g
の最初の2つのステップが重ならないため、同じ置換で実行されます。
同等の基本正規表現を使用する(読みやすくするために上記の拡張正規表現が使用されます):
sed -e ':loop' -e 's/(\([^()][^()]*\))/[\1]/; tloop' <file