Grep tutta la stringa che non inizia con i numeri


10

Sto cercando grep per mostrare tutti i personaggi che non iniziano con i numeri. Ho fatto qualcosa del genere:

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

ma non funziona. Hai qualche idea per qualche reg exp?


1
L'uso -vcon -ocausando grepnon produce alcun output.
cuonglm

Cosa intendi per mostrare tutti i personaggi ? Intendi linee che non iniziano con i numeri o vuoi eliminare tutti i numeri dall'input?
Matteo,

Per impostazione predefinita, greputilizza espressioni regolari di base . Ciò significa che il tuo ?viene trattato come un punto interrogativo letterale. O sfuggire al punto interrogativo \?o utilizzare l' -Eopzione per extendedle espressioni regolari, nel qual caso ?è un carattere modello.
Peter

Risposte:


22

grep -v '^[0-9]'

Produrrà tutte le righe che non corrispondono ( -v) alle righe che iniziano ^con un numero[0-9]

Per esempio

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

o se si desidera rimuovere tutte le parole che iniziano con una cifra

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

o con scorciatoie e affermazioni

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

Per esempio

$ 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 perché? Rimuove ogni parola che inizia con una cifra (come forse è stato posto nella domanda originale)
Matteo,

1
No, funziona. Termina con OS X (e forse con altri BSD) \> e \ <non funzionano. Per questo motivo ho citato entrambe le versioni. E ho dovuto usare quello brutto sulla mia macchina per l'esempio.
Matteo,

Dalla pagina man \> Matches the null string at the end of a word. This is equivalent to [[:>:]] '. `
Matteo,

3

Dipende da come si definisce una stringa (ad es. Se si contano i caratteri di punteggiatura su stringa o no). Tuttavia puoi iniziare da qualcosa del genere

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

2

Per rimuovere tutte le parole da una riga che inizia con un numero con sedte puoi fare:

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

... oppure, se volevi solo parole che non iniziano con i numeri stampati ciascuno su una riga separata:

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

... quanto sopra dovrebbe fare abbastanza bene. Ti consigliamo di personalizzare la traduzione della \newline y///per i divisori che ritieni pertinenti. E, a sedseconda dell'implementazione, potresti anche voler un vero e proprio <tab>al posto della \tfuga di barra rovesciata.


@don_crissti - Oh, sì - Lo metterò !davanti allo '"'scambio, ma se stai usando bashpotresti volerlo set +Ho se zshallora set -K. Secondo me, qualsiasi !espansione citata è follia. Puoi anche usare heredocs come "${0#-}" <<\CMD\nyour cmd strings\nCMD\nper ottenere comportamenti basati su script in shell interattive.
Mikeserv,

Grazie per la "${0#-}" <<...punta!
don_crissti,

@don_crissti - Se lo usi "${0#-}" -s -- arg list <<\CMD\n...puoi anche impostare i parametri posizionali al momento dell'invocazione. L'uso di "$@"o *è spesso utile per me al posto di arg list. E con ln -s "$(command -v "${0#-}")" /tmp/new_name; cd tmp; new_name <<\CMD\n...te puoi ottenere un nuovo $0e gestire ancora lo stdin.
Mikeserv,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.