sedで中かっこ「]」を抜けないのはなぜですか?

sedで中かっこ「]」を抜けないのはなぜですか?

質問:なぜ「]」を抜け出せないのですか?

$ printf "*#$@~\!&*()[]\n"
*#~\!&*()[]
$ printf "*#$@~\!&*()[]\n" | sed 's/[*#$@~!&*()\[\]]//g'
*#~\!&*()
$

答え1

内部では、[...]バックスラッシュは特別なものではありません。[\[]バックスラッシュと[1を一致させます。

]その文字をセットに含めるには、その文字が最初のものであることを確認する必要があります。[]X]一致する]か、Xwhileが一致し[X]]X次に](そして[X\]]一致するか、またはX後に\続きます])。これを除外するには:、^またはを除く[^]X]すべての文字の後に続く必要があります。]X

したがって、あなたの例では次のようになります。

sed 's/[]*\#$@~!&*()[]//g'

1sed GNUには、POSIX準拠モードが有効になっていない($POSIXLY_CORRECTまたは経由で)いくつかの例外があります。--posixしたがって、その実装との互換性のために、実際にセットにバックスラッシュを含める必要がある場合に作成するのが最善です[\\]

関連情報