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?


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

@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

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.


@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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.