Grep toda a string que não começa com número (s)

10

Estou procurando grep para mostrar todos os caracteres que não começam com números. Eu fiz algo parecido com isto:

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

mas não funciona. Você tem alguma idéia para alguma reg exp?

Paweł Jaworowski
fonte
1
Usar -vcom -ocausando grepnão produz saída.
cuonglm
O que você quer dizer com mostrar todos os personagens ? Você quer dizer linhas que não começam com números ou deseja retirar todos os números da entrada?
Matteo
Por padrão, grepusa expressões regulares básicas . Isso significa que você ?está sendo tratado como um ponto de interrogação literal. Escape do ponto de interrogação \?ou use a -Eopção para extendedexpressões regulares, caso em que ?é um caractere padrão.
Peter.O

Respostas:

22

grep -v '^[0-9]'

Irá gerar todas as linhas que não -vcorrespondem ( ) às linhas que começam ^com um número[0-9]

Por exemplo

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

ou se você deseja remover todas as palavras que começam com um dígito

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

ou com atalhos e asserções

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

Por exemplo

$ 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
fonte
@mikeserv why? Ele remove todas as palavras que começam com um dígito (como talvez pediu na pergunta original)
Matteo
1
Não, ele funciona. Terminar no OS X (e talvez outros BSDs) \> e \ <não estão funcionando. Por esse motivo, mencionei as duas versões. E eu tive que usar o feio na minha máquina como exemplo.
Matteo
Da página de manual \> Matches the null string at the end of a word. This is equivalent to [[:>:]] '. `
Matteo
3

Depende de como você define uma string (por exemplo, se você contar caracteres de pontuação como string ou não). No entanto, você pode começar de algo como

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

Para remover todas as palavras de uma linha que começa com um número, sedvocê pode:

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

... ou, se você quiser apenas palavras que não comecem com números impressos em uma linha separada:

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

... o acima deve fazer bastante bem. Convém personalizar a tradução da linha \neletrônica y///para divisores que julgar relevantes. E, seddependendo da implementação, você também pode querer um real <tab>no lugar da \tfuga da barra invertida.

mikeserv
fonte
@don_crissti - Ah, sim - eu colocarei isso !à frente da '"'troca, mas se você estiver usando, bashpoderá querer set +Hou zshentão set -K. Na minha opinião, qualquer !expansão citada é insanidade. Você também pode usar heredocs como "${0#-}" <<\CMD\nyour cmd strings\nCMD\npara obter um comportamento com script em shells interativos.
mikeserv
Obrigado pela "${0#-}" <<...dica!
31515 don_crissti
@don_crissti - Se você usar, "${0#-}" -s -- arg list <<\CMD\n...também poderá definir os parâmetros posicionais na chamada. Usar "$@"ou *geralmente é útil para mim no lugar de arg list. E com ln -s "$(command -v "${0#-}")" /tmp/new_name; cd tmp; new_name <<\CMD\n...você pode obter um novo $0e ainda lidar com stdin.
mikeserv