sedを使用して、文字列の前後の角括弧を削除します


18

Ubuntu 12.04.1 LTSのbashシェルでこのコマンドを実行しています。私は一度に一気に、[そして両方の]キャラクターを削除しようとしています。つまり、二度目のsedにパイプする必要はありません。

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

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

私が最終的に達成しようとしているのは、bashスクリプトの他の場所で使用するために、角括弧の間のものをbash変数に割り当てることですので、それを達成するためのより良い方法があれば(awkを使用することで?) 。
Xhantar

2
ただ、コメントとして追加:あなたはのようにbashののPEの機能を使用することができます str='[123]'; str1=${str/\[/}; str2=${str1/\]}; echo $str2
バレンティンBajrami

1
@ val0x00ff-純粋なbash置換..ありがとう!:)新しいことを学びました。
Xhantar

回答:


23

マニュアルを注意深く守れば、これは簡単です。キャラクタークラス内のすべてのメンバーは特別な意味を失います(いくつかの例外はあります)。そして、]がリストの最初に置かれると、その特別な意味を失います。試してください:

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

これは言う:

  1. 内側外側 [ブラケット]、すなわち、含まれる文字のいずれかを置き換えます。
    • ] そして
    • [
  2. それらのいずれかを空の文字列//で置き換えます—したがって、空の置換文字列、
  3. それらをどこでもグローバルに)置き換えますg

繰り返しますが、クラスが含まれるときは常にクラスの先頭に] なければなりません


11

なぜそれが機能しないのか分かりませんが、これは機能します:

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修飾子を追加して両方の括弧を削除ます):

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

3番目のアプローチ(egrep -o ...)は、私の問題に対する最もクリーンなソリューションのように見えます。角かっこの間には整数しかありません(そして、申し訳ありませんが、私の質問でそのことについて言及する必要がありました)。ありがとう!
Xhantar

3
また、使用することができますtrecho '[123]' | tr -d '[]'-エスケープについての正規表現の混乱を回避することができます。
ジェームズオゴーマン

@ジェームズ・オゴーマン-興味深い。何らかの理由trで、一度に最大1文字しか翻訳できないと思いましたが、私は間違っていました。ありがとう!
Xhantar

4

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

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

データがこのように常に角括弧で始まり、角括弧で終わることを意味する場合:

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

作業しているデータは、常に角括弧で始まり、角括弧で終わります。それでも私のソリューションが機能しなかった理由を知りたい。何か案は?そして、2x正規表現を指定せずにこれを行う方法はありますか?
Xhantar

1
@Guruこのソリューションは私から働いていました、そしてXhantarに関しては、これは本当に遅い返信ですが、あなたのコードとtldp.orgのBash Beginnersガイドから見ることができるのは、複数の検索と置換を試みていました「[」と「]」のもう一方は機能しません。2つの異なる検索と置換のスペースを空けるには、「;」を使用します または-eオプション。's / <検索> / <置換> / g; s / <search> / <replace> / g 'またはsed -e' s / <search> / <replace> / g '-e' s / <search> / <replace> / g '
ArunMKumar

1

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

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

1

を使用して開き括弧をエスケープでき\[ます。閉じ括弧には、を使用します[]]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.