Localizando e removendo palavras que começam / terminam com números

1

Eu tenho um arquivo grande (> 10000 linhas) que contém uma palavra por linha, com um caractere de nova linha após cada palavra. As palavras não contêm espaços.

Gostaria de listar (ou, melhor ainda, enviar para um novo arquivo) todas as palavras que começam e / ou terminam com um número, então eu gostaria de removê-las do arquivo original. Mas não quero remover palavras que apenas contenham números.

Por exemplo, se eu tivesse o conteúdo

789
hello
1hello
112121hello3323
he11o
hello9
88888

Em seguida, as strings 1hello , 112121hello3323 , hello9 receberão a saída e, em seguida, serão removidas do arquivo.

Como posso fazer isso?

    
por CS Student 09.02.2016 / 12:21

3 respostas

2

GNU grep

grep -vP '^\d+\D|\D\d+$'

produz

789
hello
he11o
88888
    
por 09.02.2016 / 12:30
1

Para realmente editar o arquivo de origem e criar um novo arquivo com as descartes é um pouco mais complicado. Eu faria isso

$ cat file
789
hello
1hello
112121hello3323
he11o
hello9
88888

$ perl -i -lne 'if (/^\d+\D|\D\d+$/) {warn "$_\n"} else {print}' file 2>file_nums

$ cat file
789
hello
he11o
88888

$ cat file_nums
1hello
112121hello3323
hello9

As linhas correspondentes são exibidas no stderr, que é redirecionado para um arquivo separado. O -i flag do perl cuida de salvar as alterações no local.

O one-liner pode ser ainda mais complicado:

perl -i -lne 'print {/^\d+\D|\D\d+$/ ? STDERR : ARGVOUT} $_' file 2>file_nums
    
por 09.02.2016 / 15:32
1

Uma solução awk :

awk '$0!~/.*[[:alpha:]][[:digit:]]+$/ && $0!~/^[[:digit:]]+[[:alpha:]]+/' words.txt
789
hello
he11o
88888
    
por 09.02.2016 / 17:36