2017-11-24 8 views
1

Ich versuche, diese beiden als Gruppen zu erfassen: (.*} und [.*] daraus:Kann nicht mehrere Gruppen erfassen

blahBLACK(+){+}tao[,Tom]101111foo 

so möchte ich (+){+} und [,Tom] jeweils eine Gruppe sein.

ich das versucht:

echo "blahBLACK(+){+}tao[,Tom]101111foo" | sed -E 's/(\[.*\]) (\(.*})/\2\1---/' 

Aber es gibt nur die gesamte Linie blahBLACK(+){+}tao[,Tom]101111foo ohne etwas zu ändern, es funktioniert nur für eine Gruppe, nur wenn ich sed -E 's/(\[.*\])/\1---/' zum Beispiel tun, dann kann ich sehen, dass es etwas tut, :

blahBLACK(+){+}tao[,Tom]---101111foo 

Aber der Ausgang ich das will, ist, für verschiedene Gruppen:

[,Tom](+){+}---blahBLACKtao101111foo 

Warum macht es nicht zwei Gruppen und wie bekomme ich die gewünschte Ausgabe?

BEARBEITEN: Ich muss sed verwenden, um dies leider zu lösen.

+2

Vielleicht ist die '' bash' und shell' Tags aus dieser gelöscht werden sollen, wenn eine akzeptable Antwort nur 'sed' verwenden kann . – ghoti

Antwort

3

Ihr Muster passt nicht, weil:

  • [,Tom]nach(*){*} im Eingang kommt, und

  • Es gibt keine Leerzeichen im Eingabetext, aber es ist eine, in der Muster.

Es gibt keine regex Syntax für „Spiel A und B in beliebiger Reihenfolge“, also, wenn Sie nicht wissen, in welcher Reihenfolge sie sind in, Sie gehen yo beiden Möglichkeiten zu versuchen.

Eine mögliche Lösung wäre, zunächst die eingeklammerten Teilzeichen an den Anfang zu verschieben und dann die andere Teilkette bewegen:

sed -E 's/(.*)(\[.*\])/\2\1/; s/(\[.*\])(.*)(\(.*})/\1\3\2---/' 
+0

Das hat funktioniert, danke für die Antwort. –

3

Sie können Ihre Eingabe mit 5 Teilen denken:

blahBLACK(+){+}tao[,Tom]101111foo 
^^^^^^^^^  ^^^  ^^^^^^^^^ 
    1  2 3 4  5 

Und Sie möchten es wie folgt neu anordnen:

[,Tom](+){+}---blahBLACKtao101111foo 
^^^^^^   ^^^^^^^^^ ^^^^^^^^^ 
    4  2   1  3  5 

Sie können die diese Gruppen schreiben und neu ordnen sie entsprechend:

sed -E 's/^(.*)(\(.*})(.*)(\[.*\])(.*)/\4\2---\1\3\5/' <<< "blahBLACK(+){+}tao[,Tom]101111foo"