Ich muss einfach die Übereinstimmung aus einem regulären Ausdruck erhalten:
$ cat myfile.txt | SOMETHING_HERE "/(\w).+/"
Die Ausgabe muss nur das sein, was in der Klammer übereinstimmt.
Ich glaube nicht, dass ich grep verwenden kann, da es mit der gesamten Zeile übereinstimmt.
Bitte lassen Sie mich wissen, wie das geht.
sed
Meine Güte ... Hast du eine Ahnung, wie oft ich mit Gegenreferenzen gerungen habe, um das zu tun?quelle
Wenn Sie nur möchten, was in Klammern steht, benötigen Sie etwas, das die Erfassung von Unterübereinstimmungen (benannte oder nummerierte Erfassungsgruppen) unterstützt. Ich glaube nicht, dass grep oder egrep das können, perl und sed können. Zum Beispiel mit Perl:
Wenn eine Datei mit dem Namen foo folgende Zeile enthält:
Und du machst:
Der Buchstabe a wird zurückgegeben. Das ist vielleicht nicht das, was Sie wollen. Wenn Sie uns mitteilen, was Sie abgleichen möchten, erhalten Sie möglicherweise bessere Hilfe. $ 1 ist das, was im ersten Satz von Klammern erfasst wurde. $ 2 wäre der zweite Satz usw.
quelle
Da Sie Ihre Frage zusätzlich zur Shell als bash markiert haben , gibt es neben grep noch eine andere Lösung :
Bash hat seit Version 3.0 eine eigene reguläre Ausdrucks-Engine, die den
=~
Operator verwendet, genau wie Perl.jetzt mit folgendem Code:
bash
und nicht nur aufrufensh
müssen, um alle Erweiterungen zu erhalten$BASH_REMATCH
gibt die gesamte Zeichenfolge an, die mit dem gesamten regulären Ausdruck übereinstimmt, also<Lane>8</Lane>
${BASH_REMATCH[1]}
gibt den von der 1. Gruppe abgeglichenen Teil also nur an8
quelle
>
Symbol für ganz unterschiedliche Zwecke verwenden), wie sie von der schnellen SANSparallel-Ausrichtungssoftware für große Maßstäbe ausgespuckt wurden . Natürlich werden beide Formate interlaced gespuckt, ohne dass es zu einem Escape kommt. Es ist daher unmöglich, eine Standard-XML-Bibliothek darauf zu werfen. Und ich verwende an dieser Stelle des Codes Bash-Regex, weil ich nur ein paar Daten extrahieren muss und 2 Regex die Aufgabe viel besser für mich erledigen, als einen dedizierten Parser für dieses Durcheinander zu schreiben. #LifeInBioinformaticsAngenommen, die Datei enthält:
Und Sie möchten die Zeichen zwischen
>
und</
, können Sie entweder verwenden:grep
grep -oP '.*\K(?<=>)\w+(?=<\/)' file
sed
sed -nE 's:^.*>(\w+)</.*$:\1:p' file
awk
awk '{print(gensub("^.*>(\\w+)</.*$","\\1","g"))}' file
perl
perl -nle 'print $1 if />(\w+)<\//' file
Alle geben einen String "xyz" aus.
Wenn Sie die Ziffern dieser Zeile erfassen möchten:
grep
grep -oP '.*\K(?<=>)[0-9]+(?=<\/)' file
sed
sed -E 's:^.*>([0-9]+)</.*$:\1:' file
awk
awk '{print(gensub(".*>([0-9]+)</.*","\\1","g"))}' file
perl
perl -nle 'print $1 if />([0-9]+)<\//' file
quelle
Dies wird das erreichen, was Sie verlangen, aber ich denke nicht, dass es das ist, was Sie wirklich wollen. Ich habe die
.*
Regex in den Vordergrund gestellt, um vor dem Match etwas zu essen, aber das ist eine gierige Operation, daher stimmt dies nur mit dem vorletzten\w
Charakter in der Zeichenfolge überein .Beachten Sie, dass Sie die Parens und die entkommen müssen
+
.quelle