2017-02-08 2 views
0

Ich habe diese komplexe RegexPerl oneliner in bash: print Spiele von komplexem regexp

/"_outV":([0-9]+),"_inV":([0-9]+),"_label":"([a-z\/]+)",/ 

und ich brauche eine Datei zu analysieren (die alle auf einer einzigen Zeile ist) und Ausgang nur die angepassten Gruppen wie

print $1 $2 $3 

Derzeit ist die einzige fast arbeiten onliner ist

perl -pe 'while(m/"_outV":([0-9]+)\,"_inV":([0-9]+)\,"_label":"([a-z\/]+)\"\,/g){print "$1 $2 $3\n";}' 

Aber es endet am Ende, nach den Spielen, auch die gesamte Datei. Wie behebe ich das?

Ich dachte, dass das Entfernen der -p Option den Trick machen würde, aber es nicht tut.

+1

Einige Beispieldaten helfen würde. Das sieht so aus, als hättest du etwas zu parsen, und du versuchst es zu regexen, was wahrscheinlich der falsche Weg ist, es anzugehen. – Sobrique

+1

Ich fing an, eine Antwort zu schreiben, aber ich muss jetzt gehen. Meine Absicht war zu sagen, dass Sie sich nicht für ein einzeiliges Programm in irgendeiner Sprache bemühen sollten. Zwei Ebenen der Flucht machen alles furchtbar schwierig zu debuggen. Wenn Sie keinen guten Grund haben, einen einzeiligen Befehl zu benötigen, und ich kann mir keinen gültigen vorstellen, dann ist es viel besser als Perl-Programm in einer separaten Datei geschrieben. Alles, was über ein triviales Regex-Muster hinausgeht, sollte die Möglichkeiten des Änderns des Begrenzers und des Modifizierers "/ x" verwenden. Komplexe Einzeiler sind für junge Programmierer, die gerne "Tricks" spielen; sie sind nicht für den professionellen Einsatz, – Borodin

+0

@Borodin Dies ist kaum komplex. – 123

Antwort

2

Sieht gut aus für mich. Sie müssen ersetzen die -p mit -n und here is why.

Einige Feinheiten:

  • Keine Notwendigkeit, jene , und " diese Schrägstrich.
  • Sie können bequem [0-9] durch \d ersetzen.
  • Mit einem anderen Trennzeichen für die Regex müssen Sie nicht die / zu entkommen.

End Ergebnis optimiert

perl -ne 'print "$1 $2 $3\n" while m{"_outV":(\d+),"_inV":(\d+),"_label":"([a-z/]+)",}g' 
+0

Super, und die Optimierung ist noch besser! – Kuzeko

+1

Die obligatorische Bedingung ist, dass '\ d' und' [0-9] 'nicht äquivalent sind, es sei denn, der'/a'-Modifikator ist vorhanden – Borodin

+0

@Borodin Hah! Ich wusste nicht über '/ a' :) Noch ein Stück zu lesen. Warum jemand mir jemals zuhört, werde ich nie erfahren. – bobbogo