Ich führe diesen Befehl in einer Bash-Shell unter Ubuntu 12.04.1 LTS aus. Ich versuche, sowohl die [
als auch die ]
Zeichen auf einen Schlag zu entfernen , dh ohne ein zweites Mal pfeifen zu müssen, um zu sedieren.
Ich weiß, dass eckige Klammern in einem regulären Ausdruck eine besondere Bedeutung haben, daher kann ich sie umgehen, indem ich ihnen einen Backslash voranstelle. Das Ergebnis, das ich erwartet hatte, war nur die Saite, 123
aber die eckigen Klammern bleiben und ich würde gerne wissen, warum!
~$ echo '[123]' | sed 's/[\[\]]//'
[123]
str='[123]'; str1=${str/\[/}; str2=${str1/\]}; echo $str2
Antworten:
Dies ist einfach, wenn Sie das Handbuch sorgfältig befolgen : Alle Mitglieder innerhalb einer Zeichenklasse verlieren (mit wenigen Ausnahmen) eine besondere Bedeutung. Und] verliert seine besondere Bedeutung, wenn es an erster Stelle in der Liste steht. Versuchen:
Das sagt:
]
und[
//
,g
.Auch hier
]
muss in der Klasse sein , zuerst , wenn es enthalten ist.quelle
Ich bin nicht sicher, warum das nicht funktioniert, aber das tut:
oder dieses:
Sie können auch einen anderen Ansatz wählen und die Zeichenfolge in den Klammern abgleichen (vorausgesetzt, die Zeichenfolge kann leicht abgeglichen werden und wird nicht durch die Klammern definiert):
Ich habe die gleichen Probleme mit Ihrer ursprünglichen Regex-Verwendung,
grep
daher vermute ich, dass dies nicht nur einesed
Sache ist.Seltsamerweise führen diese zu unterschiedlichen Ergebnissen, aber eines davon entspricht genau Ihren Vorstellungen:
Wenden Sie dies auf Ihr Original an
sed
(und fügen Sie den/g
Modifikator hinzu, sodass beide Klammern entfernt werden):quelle
tr
:echo '[123]' | tr -d '[]'
- Vermeidet regexp-Verwechslungen bei der Flucht.tr
nur ein Zeichen gleichzeitig übersetzt werden kann, aber ich habe mich geirrt. Vielen Dank!So entfernen Sie alles vor und nach den Klammern:
Wenn Ihre Daten so sind, bedeutet dies immer, dass sie mit eckigen Klammern beginnen und enden:
quelle
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:
quelle
Sie können die öffnende Klammer mit verlassen
\[
. Verwenden Sie für die schließende Klammer[]]
.quelle