Como você analisa as palavras de um arquivo?

1

Olá, digamos que eu tenha um arquivo parecido com este

<jack,
john.
................
,joe
..........Jen..
>Tom
Edwa4rd
4Tim
Richard

Como faço para transformar isso em uma lista limpa como

jack
John
joe
Jen
Tom
Tim
Richard

Observe que Edward não está na lista

Usando comandos do Linux? Provavelmente grep e / ou sed

    
por user893730 05.05.2012 / 07:37

3 respostas

2

Experimente egrep -o '[A-Za-z](.*[A-Za-z])?' < infile | egrep -o '[A-Za-z]+' > outfile para o seu exemplo.

A primeira parte seleciona coisas semelhantes a nomes (deve começar com uma letra e terminar com uma letra, mas pode conter qualquer coisa entre elas), e então a segunda egrep nos filtra para apenas os nomes que são todos letras.

Olhando para isso, já posso ver vários caminhos sobre como criar uma entrada que faria com que essas expressões falhassem e não correspondessem exatamente às coisas corretas (bem, isso corresponderá como está escrito, mas você deixou ambiguidades - Como deve ..Richard..<Tim?.. ser tratado?), Mas foi fácil colocar isso em conjunto com base nos dados de entrada - o shell script geralmente tem menos de 100% de exatidão matemática para todas as entradas possíveis, mas sim conhecer seu domínio de entrada e obter o trabalho feito com expressões e comandos que funcionam bem o suficiente para a entrada que você está tendo que processar.

    
por 05.05.2012 / 08:21
1

O regex ^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$ deve funcionar.

  1. ^ corresponde ao início da linha
  2. [^a-zA-Z]* corresponde a zero ou mais ocorrências de uma não letra
  3. [a-zA-Z]+ corresponde a uma ou mais ocorrências de uma letra
  4. [^a-zA-Z]* corresponde a zero ou mais ocorrências de uma não letra
  5. $ corresponde ao fim da linha

Assim, ele ignorará as letras principais e não-letivas em uma linha e corresponderá apenas se não houver letras entre a primeira letra e a última letra.

O parêntese indica um grupo de captura, que é a parte que queremos extrair e imprimir. Eu originalmente escrevi e testei isso para .NET, mas aqui está um comando sed . Não me pergunte como sed funciona, não tenho ideia.

sed -rn 's/^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$//p' inputfile

Em vez de imprimir, você pode escrever diretamente em um arquivo de saída:

sed -rn 's/^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$//w outputfile' inputfile
    
por 05.05.2012 / 09:12
1

Use grep -o '[[:alpha:]]\+' para extrair todas as "palavras".

jack
john
joe
Jen
Tom
Edwa
rd
Tim
Richard

Cabe então a você determinar quais são nomes e quais são apenas seqüências de letras.

    
por 05.05.2012 / 14:28

Tags