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.
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.
Antworten:
Versuche dies:
grep -oP '(?<=ID: )[0-9]+' file
oder:
perl -nle 'print $1 if /ID:.*?(\d+)/' file
-o
und -P
GNU-Erweiterungen zu sind grep
. -o
funktioniert auch auf den BSDs. PCRE-Unterstützung mit -P
wird auch nicht immer kompiliert.
Verwenden Sie diese Option egrep
mit -o
oder grep
mit -Eo
, um nur das übereinstimmende Segment abzurufen. Verwenden Sie [0-9]
als Regex, um nur Zahlen zu erhalten:
grep -Eo [0-9]+ filename
Es gibt viele Möglichkeiten, dies zu tun. Zum Beispiel:
Verwenden Sie GNU grep
mit aktuellen PCREs und stimmen Sie die folgenden Zahlen ab ID:
:
grep -oP 'ID:\s*\K\d+' file
Verwenden Sie awk
und drucken Sie einfach das letzte Feld aller Zeilen, die mit beginnenID:
awk '/^ID:/{print $NF}' file
Dadurch werden auch Felder gedruckt, die keine Zahlen sind, um nur Zahlen zu erhalten, und nur im zweiten Feld verwenden
awk '($1=="ID:" && $2~/^[0-9]+$/){print $2}' file
Verwenden Sie GNU grep mit erweiterten regulären Ausdrücken und analysieren Sie es zweimal:
grep -Eo '^ID: *[0-9]+' file | grep -o '[0-9]*'
\K
macht das erste Beispiel?
-o
nur den passenden Teil drucken, aber auch Dinge verwerfen, an denen ich nicht interessiert bin. Vergleiche echo "foobar" | grep -oP "foobar"
undecho "foobar" | grep -oP 'foo\Kbar'
sed -n '/ID: 54376/,${s/[^ 0-9]*//g;/./p}'
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 keine p
leeren Zeilen zu drucken, nachdem die nicht {numerischen, Leerzeichen} Zeichen entfernt wurden.
Es adressiert Zeilen von Regex /ID: 54376/
,
bis zum $
letzten und s///
entfernt darauf alle oder einige *
Zeichen, die ^
nicht gedruckt werden , [^ 0-9]*
und p
druckt dann /
keine /
Zeile mit einem .
verbleibenden Zeichen.
{
echo line
printf 'ID: 54376\nno_nums_or_spaces\n'
printf '%s @nd 0th3r char@cter$ %s\n' $(seq 10)
echo 'ID: 54376'
} | sed -n '/ID 54376/,${s/[^ 0-9]*//g;/./p}'
54376
1 03 2
3 03 4
5 03 6
7 03 8
9 03 10
54376
Mit sed:
{
echo "ID: 1"
echo "Line doesn't start with ID: "
echo "ID: Non-numbers"
echo "ID: 4"
} | sed -n '/^ID: [0-9][0-9]*$/s/ID: //p'
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 das s/ID: //p
ist von der Form s/pattern/repl/flags
- s
bedeutet wir Ersetzen Sie das Muster "ID: "
durch Ersetzungstext ""
(leere Zeichenfolge) mithilfe des p
Flags. Dies bedeutet "Diese Zeile nach dem Ersetzen drucken".
Ausgabe:
1
4
Ein weiterer GNU sed Befehl,
sed -nr '/ID: [0-9]+/ s/.*ID: +([0-9]+).*/\1/p' file
Es druckt eine beliebige Zahl nach ID:
+
. Wenn der Unterschied zwischen einem Zeichen und 3 Zeichen darin besteht, dass Ihr Skript möglicherweise nicht in allen sed
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 erste ID: [0-9]
in einer Zeile, die zwei Vorkommen von enthält ID: [0-9]
.
Verwenden Sie grep + awk:
grep "^ID" your_file | awk {'print $2'}
Bonus: leicht zu lesen :)
grep
wenn Sie verwenden awk
. 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.