なぜ]をsedと一致させることはできませんか?

なぜ]をsedと一致させることはできませんか?

sedの文字セットと一致させようとしていますが、何らかの理由で[気に入りません。]]

$ echo 'foo [bar]' | sed -E 's/[\[\]]//g'
foo [bar]

以下はうまくいきます:

$ echo 'foo [bar]' | sed -E 's/\]//g'
foo [bar
$ echo 'foo [bar]' | sed -E 's/[\[]//g'
foo bar]

ただし、何らかの理由で]この文字セットの内部がこれを破ります。

$ echo 'foo [bar]' | sed -E 's/[\]]//g'
foo [bar]

奇妙なことに、これも動作します:

$ echo 'foo [bar]' | sed -E 's/[]]//g'
foo [bar
$ echo 'foo [bar]' | sed -E 's/[[]//g'
foo bar]

しかし、これではありません:

$ echo 'foo [bar]' | sed -E 's/[[]]//g'
foo [bar]

一種の追加脱出が必要ですか、それともこれは可能ですか?

答え1

]角括弧式内のorは[エスケープする必要はありません。角括弧式のバックスラッシュはエスケープされた意味を失いますが、リテラルバックスラッシュ文字と一致します。したがって、これを行うと、最初の部分と2番目の部分の2文字を一致させるように[\]]指示しますが、入力の文字列が一致しないため、何も変更されません。文字を一致させるには、角かっこ式で使用する場合にのみ必要です。そうでない場合はリテラルを使用することもできます。sed\[\]]\]][]]]

また、角括弧式では、[...]その文字が]最初の文字である必要があるため、これを行う's/[[]]//g'必要があります's/[][]//g'

関連情報