![sedで中かっこ「]」を抜けないのはなぜですか?](https://linux33.com/image/65028/sed%E3%81%A7%E4%B8%AD%E3%81%8B%E3%81%A3%E3%81%93%E3%80%8C%5D%E3%80%8D%E3%82%92%E6%8A%9C%E3%81%91%E3%81%AA%E3%81%84%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F.png)
質問:なぜ「]」を抜け出せないのですか?
$ printf "*#$@~\!&*()[]\n"
*#~\!&*()[]
$ printf "*#$@~\!&*()[]\n" | sed 's/[*#$@~!&*()\[\]]//g'
*#~\!&*()
$
答え1
内部では、[...]
バックスラッシュは特別なものではありません。[\[]
バックスラッシュと[
1を一致させます。
]
その文字をセットに含めるには、その文字が最初のものであることを確認する必要があります。[]X]
一致する]
か、X
whileが一致し[X]]
、X
次に]
(そして[X\]]
一致するか、またはX
後に\
続きます]
)。これを除外するには:、^
またはを除く[^]X]
すべての文字の後に続く必要があります。]
X
したがって、あなたの例では次のようになります。
sed 's/[]*\#$@~!&*()[]//g'
1sed
GNUには、POSIX準拠モードが有効になっていない($POSIXLY_CORRECT
または経由で)いくつかの例外があります。--posix
したがって、その実装との互換性のために、実際にセットにバックスラッシュを含める必要がある場合に作成するのが最善です[\\]
。