Also habe ich eine Zeile:
ID: 54376
Können Sie mir helfen, einen regulären Ausdruck zu erstellen, der nur Zahlen ohne "ID:" zurückgibt?
HINWEIS: Diese Zeichenfolge befindet sich in einer Datei.
text-processing
regular-expression
Blake Gibbs
quelle
quelle
-o
und-P
GNU-Erweiterungen zu sindgrep
.-o
funktioniert auch auf den BSDs. PCRE-Unterstützung mit-P
wird auch nicht immer kompiliert.Verwenden Sie diese Option
egrep
mit-o
odergrep
mit-Eo
, um nur das übereinstimmende Segment abzurufen. Verwenden Sie[0-9]
als Regex, um nur Zahlen zu erhalten:quelle
Es gibt viele Möglichkeiten, dies zu tun. Zum Beispiel:
Verwenden Sie GNU
grep
mit aktuellen PCREs und stimmen Sie die folgenden Zahlen abID:
:Verwenden Sie
awk
und drucken Sie einfach das letzte Feld aller Zeilen, die mit beginnenID:
Dadurch werden auch Felder gedruckt, die keine Zahlen sind, um nur Zahlen zu erhalten, und nur im zweiten Feld verwenden
Verwenden Sie GNU grep mit erweiterten regulären Ausdrücken und analysieren Sie es zweimal:
quelle
\K
macht das erste Beispiel?-o
nur den passenden Teil drucken, aber auch Dinge verwerfen, an denen ich nicht interessiert bin. Vergleicheecho "foobar" | grep -oP "foobar"
undecho "foobar" | grep -oP 'foo\Kbar'
Dadurch werden nur alle Zahlen und Leerzeichen gedruckt, die nach
ID: 54376
einer Dateieingabe auftreten.Ich habe das Obige gerade ein wenig aktualisiert, um es ein wenig schneller zu machen
*
und keinep
leeren Zeilen zu drucken, nachdem die nicht {numerischen, Leerzeichen} Zeichen entfernt wurden.Es adressiert Zeilen von Regex
/ID: 54376/
,
bis zum$
letzten unds///
entfernt darauf alle oder einige*
Zeichen, die^
nicht gedruckt werden ,[^ 0-9]*
undp
druckt dann/
keine/
Zeile mit einem.
verbleibenden Zeichen.DEMO:
AUSGABE:
quelle
Mit sed:
Das
-n
ist "standardmäßig nichts drucken", das/^ID: [0-9][0-9]*$/
ist "für Zeilen, die diesem regulären Ausdruck entsprechen" (beginnt mit "ID:", dann 1 oder mehr Ziffern, dann Zeilenende), und dass/ID: //p
ist von der Forms/pattern/repl/flags
-s
bedeutet wir Ersetzen Sie das Muster"ID: "
durch Ersetzungstext""
(leere Zeichenfolge) mithilfe desp
Flags. Dies bedeutet "Diese Zeile nach dem Ersetzen drucken".Ausgabe:
quelle
Ein weiterer GNU sed Befehl,
Es druckt eine beliebige Zahl nach
ID:
quelle
+
. Wenn der Unterschied zwischen einem Zeichen und 3 Zeichen darin besteht, dass Ihr Skript möglicherweise nicht in allensed
s funktioniert , sollten Sie wahrscheinlich Folgendes tun :sed -n '/ID: \([0-9][0-9]*\).*/{s//\1/;s/.*[^0-9]//;/./p}'
. Ihre Antwort verfehlt auch die ersteID: [0-9]
in einer Zeile, die zwei Vorkommen von enthältID: [0-9]
.Verwenden Sie grep + awk:
Bonus: leicht zu lesen :)
quelle
grep
wenn Sie verwendenawk
.awk '/^ID/ { print $2 }'
macht das Gleiche und vermeidet Probleme mit der Grep-Zeilenpufferung . Es ist auch so ziemlich das Gleiche wie eine der Lösungen in @ terdons Antwort.