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'
。