Gibt es eine Möglichkeit, sed
nur erfasste Gruppen auszugeben? Zum Beispiel angesichts der Eingabe:
This is a sample 123 text and some 987 numbers
und Muster:
/([\d]+)/
Könnte ich nur 123- und 987-Ausgaben erhalten, die durch Rückverweise formatiert sind?
sed
erweiterte reguläre Ausdrücke mit dem-E
Flag aktiviert werden müssen.Antworten:
Der Schlüssel, um dies zum Laufen zu bringen, besteht
sed
darin, anzugeben, was nicht ausgegeben werden soll, und anzugeben, was Sie möchten.Dies sagt:
-n
)p
)Im Allgemeinen
sed
erfassen Sie Gruppen in Klammern und geben das, was Sie erfassen, mithilfe einer Rückreferenz aus:gibt "bar" aus. Wenn Sie
-r
(-E
für OS X) für erweiterten regulären Ausdruck verwenden, müssen Sie die Klammern nicht umgehen:Es können bis zu 9 Erfassungsgruppen und deren Rückverweise vorhanden sein. Die Rückverweise sind in der Reihenfolge nummeriert, in der die Gruppen angezeigt werden. Sie können jedoch in beliebiger Reihenfolge verwendet und wiederholt werden:
gibt "a bar a" aus.
Wenn Sie GNU haben
grep
(es kann auch in BSD funktionieren, einschließlich OS X):oder Variationen wie:
Die
-P
Option aktiviert Perl-kompatible reguläre Ausdrücke. Sieheman 3 pcrepattern
oderman 3 pcresyntax
.quelle
sed
Beispiel beziehen und die-r
Option (oder-E
für OS X, IIRC) verwenden, müssen Sie die Klammern nicht umgehen. Der Unterschied besteht darin, dass zwischen regulären Grundausdrücken und erweiterten regulären Ausdrücken (-r
).Sed hat bis zu neun gespeicherte Muster, aber Sie müssen maskierte Klammern verwenden, um sich Teile des regulären Ausdrucks zu merken.
Sehen Sie hier für Beispiele und detaillierten
quelle
sed -e 's/version=\(.+\)/\1/' input.txt
Dies wird immer noch die gesamte input.txt\+
statt schreiben+
. Und ich verstehe nicht, warum Leute-e
nur für einen sed-Befehl verwenden.sed -e -n 's/version=\(.+\)/\1/p' input.txt
siehe: mikeplate.com/2012/05/09/…sed -E
, die sogenannten "modernen" oder "erweiterten" regulären Ausdrücke zu verwenden, die Perl / Java / JavaScript / Go / was auch immer viel näher kommen. (Vergleiche mitgrep -E
oderegrep
.) Die Standardsyntax enthält diese seltsamen Escape-Regeln und gilt als "veraltet". Weitere Informationen zu den Unterschieden zwischen den beiden finden Sie unterman 7 re_format
.Sie können grep verwenden
quelle
o
Option - unixhelp.ed.ac.uk/CGI/man-cgi?grep : -o, --only-match Zeigt nur den Teil einer übereinstimmenden Zeile an, der mit PATTERN übereinstimmtgrep -Eow -e "[0-9]+" -e "[abc]{2,3}"
Ich weiß nicht, wie Sie diese beiden Ausdrücke in einer Zeile haben können, abgesehen von der Weiterleitung von einem vorherigen grep (was immer noch nicht funktionieren könnte, wenn eines der Muster mehr als einmal in einer Zeile übereinstimmt ).Lauf (e) von Ziffern
Diese Antwort funktioniert mit einer beliebigen Anzahl von Zifferngruppen. Beispiel:
Erweiterte Antwort.
Ja. Ersetzen Sie den gesamten Text durch die Erfassungsgruppe:
Oder mit erweiterter Syntax (weniger Anführungszeichen und die Verwendung von +):
Verwenden Sie Folgendes, um zu vermeiden, dass der Originaltext gedruckt wird, wenn keine Nummer vorhanden ist:
Und um mehrere Zahlen abzugleichen (und sie auch auszudrucken):
Das funktioniert für jede Anzahl von Ziffernläufen:
Welches ist dem Befehl grep sehr ähnlich:
Über \ d
Sed erkennt die Syntax '\ d' (Verknüpfung) nicht. Das oben verwendete ASCII-Äquivalent
[0-9]
ist nicht genau äquivalent. Die einzige alternative Lösung besteht darin, eine Zeichenklasse zu verwenden: '[[: digit:]] `.Die ausgewählte Antwort verwendet solche "Zeichenklassen", um eine Lösung zu erstellen:
Diese Lösung funktioniert nur für (genau) zwei Ziffernläufe.
Während die Antwort in der Shell ausgeführt wird, können wir natürlich einige Variablen definieren, um diese Antwort zu verkürzen:
Wie bereits erläutert, ist die Verwendung eines
s/…/…/gp
Befehls jedoch besser:Dies umfasst sowohl wiederholte Ziffernläufe als auch das Schreiben eines kurzen (er) Befehls.
quelle
Ich glaube, das in der Frage angegebene Muster diente nur als Beispiel, und das Ziel war es, mit jedem Muster übereinzustimmen.
Wenn Sie ein Sed mit der GNU-Erweiterung haben, das das Einfügen einer neuen Zeile in den Musterbereich ermöglicht, lautet ein Vorschlag:
Diese Beispiele sind mit tcsh (ja, ich weiß, es ist die falsche Shell) mit CYGWIN. (Bearbeiten: Entfernen Sie für Bash set und die Leerzeichen um =.)
quelle
+
, müssten Sie es maskieren oder die-r
Option (-E
für OS X) verwenden. Sie können auch verwenden\{1,\}
(oder-r
oder-E
ohne die Flucht).Gib auf und benutze Perl
Da
sed
es nicht schneidet, werfen wir einfach das Handtuch und verwenden Perl, zumindest ist es LSB, währendgrep
GNU-Erweiterungen nicht sind :-)Drucken Sie das gesamte passende Teil aus, es sind keine passenden Gruppen oder Looks erforderlich:
Ausgabe:
Einzelübereinstimmung pro Zeile, häufig strukturierte Datenfelder:
Ausgabe:
Mit Lookbehind:
Mehrere Felder:
Ausgabe:
Mehrere Übereinstimmungen pro Zeile, häufig unstrukturierte Daten:
Ausgabe:
Mit Lookbehind:
Ausgabe:
quelle
Versuchen
Ich habe das unter Cygwin:
quelle
Es ist nicht das, wonach das OP gefragt hat (Erfassen von Gruppen), aber Sie können die Zahlen extrahieren, indem Sie:
Gibt Folgendes:
quelle