it-swarm.com.de

Verwenden Sie sed, um sowohl eine öffnende als auch eine schließende eckige Klammer um eine Schnur zu entfernen

Ich führe diesen Befehl in einer Bash-Shell unter Ubuntu 12.04.1 LTS aus. Ich versuche, sowohl die Zeichen [ Als auch ] Auf einen Schlag zu entfernen, d. H. Ohne ein zweites Mal zu sed pfeifen zu müssen.

Ich weiß, dass eckige Klammern in einer Regex eine besondere Bedeutung haben, daher entkomme ich ihnen, indem ich einen Backslash voranstelle. Das erwartete Ergebnis ist nur die Zeichenfolge 123, Aber die eckigen Klammern bleiben erhalten, und ich würde gerne wissen, warum!

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

Dies ist einfach, wenn Sie das Handbuch sorgfältig befolgen: Alle Mitglieder innerhalb einer Charakterklasse verlieren (mit wenigen Ausnahmen) eine besondere Bedeutung. Und] verliert seine besondere Bedeutung, wenn es zuerst in die Liste aufgenommen wird. Versuchen:

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

Dies sagt:

  1. ersetzen Sie in den äußeren [Klammern] eines der enthaltenen Zeichen, nämlich:
    • ] und
    • [
  2. ersetzen Sie eine davon durch die leere Zeichenfolge - daher die leere Ersetzungszeichenfolge //,
  3. ersetzen Sie sie überall ( global) - daher das endgültige g.

Nochmal, ] muss immer der erste in der Klasse sein, wenn es enthalten ist.

29
Saparagus

Ich bin mir nicht sicher, warum das nicht funktioniert, aber das funktioniert:

echo '[123]' | sed 's/\(\[\|\]\)//g'

oder dieses:

echo '[123]' | sed -r 's/(\[|\])//g'

Sie können auch einen anderen Ansatz ausprobieren und die Zeichenfolge in den Klammern abgleichen (vorausgesetzt, die Zeichenfolge kann leicht abgeglichen werden und wird nicht durch die Klammern definiert):

echo '[123]' | egrep -o "[0-9]+"

Ich habe die gleichen Probleme mit Ihrer ursprünglichen Regex mit grep, daher vermute ich, dass dies nicht nur eine sed Sache ist.

Seltsamerweise führen diese zu unterschiedlichen Ergebnissen, aber eines davon entspricht Ihren Wünschen:

echo '[123]' | egrep -o '[^][]+'
123

echo '[123]' | egrep -o '[^[]]+'
3]

Wenden Sie dies auf Ihr ursprüngliches sed an (und fügen Sie das /g Modifikator, damit beide Klammern entfernt werden):

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

So entfernen Sie alles vor und nach den Klammern:

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

Wenn Ihre Daten so sind, bedeutet dies immer, dass Sie mit eckigen Klammern beginnen und enden:

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

Wenn Sie eine komplexere Zeichenfolge wie 'abcdef [123] ghijk' haben, können Sie auch den internen Bash-Befehl 'cut' verwenden, um Text nur in eckigen Klammern zu extrahieren:

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

Sie können die öffnende Klammer mit \[ Entweichen. Verwenden Sie für die schließende Klammer []].

1
user2428118