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?

Paweł Jaworowski
quelle
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
unix.stackexchange.com/questions/60994/…
Ciro Santilli 27 病毒 审查 六四 事件 27

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
Matteo
quelle
@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
jimmij
quelle
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.

mikeserv
quelle
@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