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.