GNU grep
grep -vP '^\d+\D|\D\d+$'
produz
789
hello
he11o
88888
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?
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
Uma solução awk
:
awk '$0!~/.*[[:alpha:]][[:digit:]]+$/ && $0!~/^[[:digit:]]+[[:alpha:]]+/' words.txt
789
hello
he11o
88888