remove palavras que contenham caracteres não alfa

4

Dado um arquivo de texto com uma string separada por espaços e um inteiro separado por uma guia, eu gostaria de me livrar de todas as palavras com caracteres não-alfa, mas manter palavras consistindo de caracteres somente alfa e a aba mais o inteiro. / p>

Minhas tentativas como as abaixo não renderam nada de bom. O que eu estava tentando expressar é algo como: "substitua qualquer coisa dentro de limites de palavras que inicie e termine com 0 ou mais qualquer coisa e haja pelo menos um: digits: or: punct: entre".

sed 's/\b.*[:digits::punct:]+.*\b//g'
sed 's/\b.*[^:alpha:]+.*\b//g'

O que estou perdendo? Veja exemplos de dados de entrada abaixo.

Obrigado!

Entrada:

asdf 754m   563  
a2a 754mm   291  
754n    463  
754 ppp 1409  
754pin  4652  
pin pin 462  
754pins 652  
754 ppp </D>    1409  
<D> 754pin  4652  
pi$n pin    462  
754/p ins   652  
754 pp+p    1409  
754 p=in    4652  

Saída desejada:

asdf    563  
    291  
    463  
ppp 1409  
    4652  
pin pin 462  
    652  
 ppp    1409  
    4652  
 pin    462  
 ins    652  
    1409  
    4652  
    
por dnkb 05.05.2010 / 02:57

3 respostas

0

Basicamente, isso se torna uma longa lista de itens a serem excluídos:

sed -r 's/(^[[:digit:]]+\b|\b[[:digit:]]+[[:punct:]]*[[:alpha:]]+\b|\b[[:alpha:]]+[[:digit:]]+[[:alpha:]]+\b|\b[[:alpha:]]+[[:punct:]]+[[:alpha:]]+\b|[[:punct:]]+.*[[:punct:]]+)//g' file

Exclua estes:

  • dígitos no início da linha
  • palavras que começam com dígitos, podem incluir pontuação e terminar em caracteres alfabéticos
  • palavras que consistem em caracteres alfa, seguidos por dígitos, seguidos por alfa
  • palavras que consistem em alfa, punct, alfa
  • sequências que começam e terminam com punct chars
por 05.05.2010 / 07:28
0

Isso não seria melhor resolvido com expressões regulares?

([A-Z] + tabulação [0-9] + ) ou algo parecido

    
por 05.05.2010 / 03:49
0

Então, se eu entendi corretamente, você quer manter palavras que tenham todas as palavras ou todos os dígitos. Mas nada mais, se algo assim deveria funcionar:

(^|\s+)([A-Za-z]+|\d+)((?=\s)|(?=$))

(use com o sinalizador de múltiplas linhas)

Quando executado em sua entrada de exemplo, ele encontrará todas as entradas que sejam todos os dígitos ou todas as palavras. Essa é uma solução mais fácil em comparação à localização de todas as palavras que não correspondem, mas você pode usar isso para extrair os dados em vez de substituir os dados inválidos.

    
por 05.05.2010 / 06:15