web-dev-qa-db-ja.com

sedを使用して文字列の前後の角かっこを削除する

Ubuntu 12.04.1 LTSのbashシェルでこのコマンドを実行しています。両方を削除しようとしています[および]キャラクターは一気に急降下しました。つまり、パイプで2回目のセッドを行う必要はありません。

角かっこは正規表現で特別な意味があるので、バックスラッシュを前に付けることでエスケープしています。私が期待していた結果は、文字列123が角括弧が残っているので、その理由を知りたいです。

~$ echo '[123]' | sed 's/[\[\]]//'
[123]
23
Xhantar

manual に注意深く従えば、これは簡単です。文字クラス内のすべてのメンバーは特別な意味を失います(いくつかの例外はあります)。そして、]がリストにfirstが配置されている場合、]は特別な意味を失います。試してください:

$ echo '[123]' | sed 's/[][]//g'
123
$

これは言う:

  1. outer [ブラケット]内で、含まれている任意の文字を置き換えます。つまり、
    • ]および
    • [
  2. それらのいずれかを空の文字列で置き換えます—したがって、空の置換文字列//
  3. それらを置き換えるeverywhereglobally)—したがって、最後のg

繰り返しますが、]must含まれる場合は常にクラスの最初に配置してください。

29
Saparagus

それがうまくいかない理由はわかりませんが、これはうまくいきます:

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
11
Ladadadada

括弧の前後のすべてを削除するには:

$ echo '[123]' | sed 's/.*\[//;s/\].*//;'
123

データがこのような場合、常に角括弧で開始および終了することを意味します。

$ echo '[123]' | sed 's/.//;s/.$//;'
123
4
Guru

'abcdef [123] ghijk'のようなより複雑な文字列がある場合は、内部bashコマンド 'cut'を使用して、角かっこの間にあるテキストのみを抽出することもできます。

$ echo 'abcdef[123]ghijk' | cut -d '[' -f 2 | cut -d ']' -f 1
123
1
valentt

\[を使用して、開始ブラケットをエスケープできます。右角かっこには、[]]を使用します。

1
user2428118