Perl
$ perl -lne 's/([[:digit:]].*)//;s/-$//;print' input.txt
abc-de
fgh-ij
klm-no
pqrs
Isso realiza duas substituições, uma para excluir tudo o que começa com um dígito e remove o% arrastado-
. Use -i
opções adicionalmente para editar o arquivo original, como $ perl -i -lne 's/([[:digit:]].*)//;s/-$//;print' input.txt
Como alternativa, com correspondência e agrupamento de dígitos não desejados:
$ perl -lne 's/^(\D*)-.*//;print' input.txt
abc-de
fgh-ij
klm-no
pqrs
AWK
$ awk -F '-' '{s=$1;for(i=2;i<=NF;i++) if($i~/[0-9].*/){print s;next}else{s=s"-"$i}}' input.txt
abc-de
fgh-ij
klm-no
pqrs
A maneira como isso funciona é que tratamos -
como separador para campos e, em seguida, iteramos sobre cada linha. Nós "armazenamos em cache" o primeiro campo e passamos a iterar usando for
loop. Em cada iteração, verificamos se a coluna não contém um número em que a variável s
é preenchida. Se a coluna contiver um número, imprimiremos o que foi salvo e passaremos para a próxima linha.
Use > new_file.txt
no final para redirecionar a saída para o novo arquivo.
Python
#!/usr/bin/env python
import sys,re
with open(sys.argv[1]) as f:
for line in f:
tokens = re.split("-|\.",line.strip().replace(".deb",""))
words_only = filter(lambda x: not x.isdigit(),tokens)
print("-".join(words_only))
Usando re.split()
, detalhamos cada linha na lista de tokens e filtramos apenas tokens não dígitos.
Alternativamente, aqui está um comando de uma linha. Isso não requer precaução no caso de não haver nenhum dígito na linha, portanto, use-o somente se tiver certeza de que todas as linhas contêm números.
$ python -c 'import re,sys;f=open(sys.argv[1]);print("\n".join([ l[:re.search(r"\d",l).start()-1] for l in f]))' input.txt
Números potenciais nos nomes dos pacotes
O hvd observou corretamente nos comentários que pode haver números inteiros em nomes de pacotes, às vezes, o que pode apresentar uma dificuldade na análise do arquivo de entrada, enquanto os nomes de versão geralmente possuem pontos neles. Com isso em mente, os comandos podem ser alterados um pouco para compensar isso:
$ perl -lne 's/\d*\..*//;s/-$//;print' input.txt
$ awk '{gsub(/[0-9]*\..*/,"");print substr($0,0,length($0)-1)};' input.txt
$ python -c 'import re,sys;f=open(sys.argv[1]);print("\n".join([ l[:re.search(r"\d*\.",l).start()-1] for l in f]))' input.txt