2017-12-14 3 views
-1

Ich habe eine Datei try.txt entfernen, die wie folgt aussieht:erste eckige Klammern in jeder Zeile mit dem Inhalt in ihm (bash)

(SOME_PRINT): [a] content 
(SOME_PRINT): [a] [b] content 

Wenn ich dieses Muster am Anfang einer Zeile in der Datei: (SOME_PRINT): [<word>] (wo <word> ist eine Kombination aus Buchstaben und Zahlen nur), so würde ich es mit (OTHER_PRINT): ersetzen möchten.
Für die Datei oben, würde Ich mag einen Befehl finden, dessen Ausführung die Datei werden machen:

(OTHER_PRINT): content 
(OTHER_PRINT): [b] content  

Ich versuchte sed -r -i 's/^\(SOME_PRINT\)\: \[.*\] /\(OTHER_PRINT\)\: /' try.txt, und bekam diese Ausgabe auszuführen:

(OTHER_PRINT): content 
(OTHER_PRINT): content    

Können Sie erklären, warum [b] verschwunden ist?

+0

Beachten Sie, dass sed nicht nicht gierig unterstützt, aber wie in den Antworten der doppelten Frage angegeben, können Sie die Problemumgehung in diesem Fall verwenden .. auch können Sie vermeiden, die '()' durch Entfernen der '-r' Option – Sundeep

Antwort

1

Ändern Sie einfach Ihre Regex wie folgt aus:

sed -r -i 's/^\(SOME_PRINT\)\: \[[a-zA-Z0-9]\] /\(OTHER_PRINT\)\: /' try.txt

Ihr Fehler, dass Sie ist dieser Teil Ihrer regex ist nicht präzise genug: \[.*\]

[a] [b] von \[.*\] Fang sein kann

Eine Lösung besteht darin, nur Zeichen anzugeben, die sich zwischen eckigen Klammern befinden. Wie Sie nur alphanumerische Zeichen gesagt, kann dies durch dieses Selektor erfolgen: [a-ZA-Z0-9].

Eine andere Lösung ist die eckige Klammer von den Zeichen auszuschließen.

Ich versuche oft meine regex mit https://regex101.com/. Es ist sehr cool und verständlich.

+0

Vielen Dank für den nützlichen Link. –

Verwandte Themen