Ubuntu 12.04.1 LTSのbashシェルでこのコマンドを実行しています。両方を削除しようとしています[
および]
キャラクターは一気に急降下しました。つまり、パイプで2回目のセッドを行う必要はありません。
角かっこは正規表現で特別な意味があるので、バックスラッシュを前に付けることでエスケープしています。私が期待していた結果は、文字列123
が角括弧が残っているので、その理由を知りたいです。
~$ echo '[123]' | sed 's/[\[\]]//'
[123]
manual に注意深く従えば、これは簡単です。文字クラス内のすべてのメンバーは特別な意味を失います(いくつかの例外はあります)。そして、]がリストにfirstが配置されている場合、]は特別な意味を失います。試してください:
$ echo '[123]' | sed 's/[][]//g'
123
$
これは言う:
]
および[
//
、g
。繰り返しますが、]
must含まれる場合は常にクラスの最初に配置してください。
それがうまくいかない理由はわかりませんが、これはうまくいきます:
echo '[123]' | sed 's/\(\[\|\]\)//g'
またはこれ:
echo '[123]' | sed -r 's/(\[|\])//g'
別の方法を試して、括弧内の文字列を照合することもできます(文字列は簡単に照合でき、括弧で定義されていない場合):
echo '[123]' | egrep -o "[0-9]+"
元の正規表現でgrep
を使用して同じ問題が発生しているので、これは単なるsed
の問題ではないようです。
奇妙なことに、これらは異なる結果を生成しますが、それらの1つは希望するものと一致します。
echo '[123]' | egrep -o '[^][]+'
123
echo '[123]' | egrep -o '[^[]]+'
3]
これを元のsed
に適用します(そして/g
修飾子を追加してboth括弧を削除します):
echo '[123]' | sed 's/[][]//g'
123
括弧の前後のすべてを削除するには:
$ echo '[123]' | sed 's/.*\[//;s/\].*//;'
123
データがこのような場合、常に角括弧で開始および終了することを意味します。
$ echo '[123]' | sed 's/.//;s/.$//;'
123
'abcdef [123] ghijk'のようなより複雑な文字列がある場合は、内部bashコマンド 'cut'を使用して、角かっこの間にあるテキストのみを抽出することもできます。
$ echo 'abcdef[123]ghijk' | cut -d '[' -f 2 | cut -d ']' -f 1
123
\[
を使用して、開始ブラケットをエスケープできます。右角かっこには、[]]
を使用します。