Grep todas las cadenas que no comienzan con número (s)

10

Estoy buscando grep para mostrar todos los caracteres que no comienzan con números. He hecho algo como esto:

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

Pero no funciona. ¿Tienes alguna idea para algún registro exp?

Paweł Jaworowski
fuente
1
Usar -vcon -ocausar grepno produce salida.
Cuonglm
¿Qué quieres decir con mostrar todos los personajes ? ¿Te refieres a líneas que no comienzan con números o quieres eliminar todos los números de la entrada?
Matteo
Por defecto, grepusa expresiones regulares básicas . Esto significa que tu ?está siendo tratado como un signo de interrogación literal. Puede escapar del signo de interrogación \?o utilizar la -Eopción para extendedexpresiones regulares, en cuyo caso ?es un carácter de patrón.
Peter
unix.stackexchange.com/questions/60994/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Respuestas:

22

grep -v '^[0-9]'

Producirá todas las líneas que no ( -v) coinciden con las líneas que comienzan ^con un número[0-9]

Por ejemplo

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

o si desea eliminar todas las palabras que comienzan con un dígito

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

o con atajos y afirmaciones

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

Por ejemplo

$ 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
fuente
@mikeserv ¿por qué? Elimina todas las palabras que comienzan con un dígito (como tal vez se preguntó en la pregunta original)
Matteo
1
No, funciona. Finalice en OS X (y tal vez otros BSD) \> y \ <no funcionan. Por esta razón, mencioné ambas versiones. Y tuve que usar el feo en mi máquina para el ejemplo.
Matteo
Desde la página del manual \> Matches the null string at the end of a word. This is equivalent to [[:>:]] '. `
Matteo
3

Depende de cómo defina una cadena (por ejemplo, si cuenta los caracteres de puntuación como cadena o no). Sin embargo, puede comenzar desde algo como

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

Para eliminar todas las palabras de una línea que comienzan con un número sedque puede hacer:

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

... o, si solo desea palabras que no comienzan con números impresos cada una en una línea separada:

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

... lo anterior debería funcionar bastante bien. Deberá adaptar la traducción de línea \nelectrónica y///para los divisores que considere relevantes. Y, seddependiendo de la implementación, es posible que también desee un escape real <tab>en lugar de la \tbarra invertida.

mikeserv
fuente
@don_crissti - Oh, sí, lo pondré !antes del '"'intercambio, pero si lo estás usando bash, quizás quieras set +Ho si es zshasí set -K. En mi opinión, cualquier !expansión citada es una locura. También puede usar heredocs como "${0#-}" <<\CMD\nyour cmd strings\nCMD\npara obtener un comportamiento programado en shells interactivos.
mikeserv
Gracias por el "${0#-}" <<...consejo!
don_crissti
@don_crissti: si lo usa "${0#-}" -s -- arg list <<\CMD\n..., también puede establecer los parámetros posicionales en la invocación. Usar "$@"o *es a menudo útil para mí en lugar de arg list. Y con ln -s "$(command -v "${0#-}")" /tmp/new_name; cd tmp; new_name <<\CMD\n...usted puede obtener un nuevo $0y aún manejar stdin.
mikeserv