Grep alle Zeichenfolgen, die nicht mit Zahlen beginnen


9

Ich suche nach grep, um alle Zeichen anzuzeigen, die nicht mit Zahlen beginnen. Ich habe so etwas gemacht:

grep -v '^[1-2]*[a-zA-Z]?' -o

aber es funktioniert nicht. Hast du eine Idee für eine reg exp?


1
Verwenden -vmit -overursachen verursachen grepkeine Ausgabe.
— Cuonglm

Was meinst du mit allen Charakteren zeigen ? Sie meinen Zeilen, die nicht mit Zahlen beginnen, oder möchten Sie alle Zahlen aus der Eingabe entfernen?
— Matteo

grepVerwendet standardmäßig grundlegende reguläre Ausdrücke. Dies bedeutet, dass Sie ?als buchstäbliches Fragezeichen behandelt werden. Entferne entweder das Fragezeichen \?oder verwende die -EOption für extendedreguläre Ausdrücke. In diesem Fall ?handelt es sich um ein Musterzeichen.
— Peter.O

Antworten:


20

grep -v '^[0-9]'

Gibt alle Zeilen aus, die nicht -vmit Zeilen übereinstimmen, die ^mit einer Zahl beginnen[0-9]

Zum Beispiel

$ cat test
string
string123
123string
1string2
$ grep -v '^[0-9]' test
string
string123

oder wenn Sie alle Wörter entfernen möchten, die mit einer Ziffer beginnen

sed 's/[[:<:]][[:digit:]][[:alnum:]_]*[[:>:]]//g'

oder mit Verknüpfungen und Behauptungen

sed 's/\<\d\w*\>//g'

Zum Beispiel

$ cat test
one
two2
3three
4four4
five six
seven 8eight
9nine ten
11eleven 12twelve
a b c d
$ sed 's/[[:<:]][[:digit:]][[:alnum:]_]*[[:>:]]//g' test
one
two2


five six
seven 
 ten

a b c d

@mikeserv warum? Es entfernt jedes Wort, das mit einer Ziffer beginnt (wie vielleicht in der ursprünglichen Frage gestellt)
— Matteo

1
Nein, es funktioniert. Ende unter OS X (und möglicherweise anderen BSDs) \> und \ <funktionieren nicht. Aus diesem Grund habe ich beide Versionen erwähnt. Und ich musste das hässliche auf meinem Computer für das Beispiel verwenden.
— Matteo

Von der Manpage \> Matches the null string at the end of a word. This is equivalent to [[:>:]] '. `
— Matteo

3

Es hängt davon ab, wie Sie eine Zeichenfolge definieren (z. B. ob Sie Satzzeichen zur Zeichenfolge zählen oder nicht). Trotzdem können Sie von so etwas ausgehen

grep -Po '\b[^[:digit:]].*?\b' file

2

So entfernen Sie alle Wörter aus einer Zeile, die mit einer Zahl beginnen sed:

sed 'x;s/.*//;G
     s/[[:space:]][[:punct:]]\{0,1\}[0-9][^[:space:]]*//g
     s/\n//'

... oder wenn Sie nur Wörter möchten, die nicht mit Zahlen beginnen, die jeweils in einer separaten Zeile gedruckt sind:

sed 'y/!\t "'"'?/\n\n\n\n\n\n/;/^[_[:alpha:]]/P;D"

... das oben genannte sollte ziemlich gut tun. Sie sollten die \newline- y///Übersetzung für Teiler anpassen, die Sie für relevant halten. Und, sedje nach Implementierung, könnte man auch einen tatsächlichen wollen <tab>anstelle des \tBackslash zu entkommen.


@don_crissti - Oh, ja - ich werde das !vor den '"'Tausch stellen, aber wenn Sie verwenden bash, möchten Sie vielleicht set +Hoder wenn zshdann set -K. Meiner Meinung nach ist jede zitierte !Erweiterung Wahnsinn. Sie können auch Heredocs verwenden "${0#-}" <<\CMD\nyour cmd strings\nCMD\n, um Skriptverhalten in interaktiven Shells zu erhalten.
— Mikeserv

Danke für den "${0#-}" <<...Tipp!
— don_crissti

@don_crissti - Wenn Sie verwenden "${0#-}" -s -- arg list <<\CMD\n..., können Sie die Positionsparameter auch beim Aufruf festlegen. Verwenden "$@"oder *ist oft nützlich für mich anstelle von arg list. Und mit ln -s "$(command -v "${0#-}")" /tmp/new_name; cd tmp; new_name <<\CMD\n...dir kann man ein neues bekommen $0und trotzdem stdin handhaben.
— Mikeserv
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.