Você pode tentar:
ls /var/log/packages/*SBo| sed 's/-[0-9].*//'
Quando eu uso este comando:
ls /var/log/packages/*SBo|cut -d / -f 5
retorna isso:
webcore-fonts-3.0-noarch-3_SBo
winetricks-20120923-noarch-1_SBo
wireshark-1.12.1-x86_64-1_SBo
wxGTK-2.8.12-x86_64-3_SBo
Eu quero remover tudo a partir de um campo numérico (o restante das linhas deve ser omitido). Então eu quero que pareça:
webcore-fonts
winetricks
wireshark
wxGTK
Como fazer isso? Eu acho que awk
é perfeito, mas eu não sei como apagar o resto das linhas (mas somente se numérico).
Isso é feito facilmente com sed
:
$ ls /var/log/packages/*SBo | sed -r 's|.*/||; s/-[[:digit:]][[:digit:].]*-.*//'
webcore-fonts
winetricks
wireshark
wxGTK
Explicação:
-r
Isso permite expressões regulares estendidas que reduzem o número de escutas necessárias.
s|.*/||
Isso remove os diretórios que precedem o nome do arquivo.
s/-[[:digit:]][[:digit:].]*-.*//
Isso parece um número cercado por traços e remove-lo e tudo o que se segue. O regex usa [:digit:]
em vez de [0-9]
para garantir que ele funcione em todas as localidades e com conjuntos de caracteres estendidos.
No Mac OSX, tente:
ls /var/log/packages/*SBo | sed -E -e 's|.*/||' -e 's/-[[:digit:]][[:digit:].]*-.*//'
Se os seus arquivos puderem conter caracteres especiais em nomes como espaços, ou simples, você não gosta da idéia de analisar o comando ls
, então você pode usar find
:
find /var/log/packages -maxdepth 1 -name '*SBo' -exec sh -c 'sed s,.*/,,\;s/-[[:digit:]].*//<<<"$0"' {} \;
Você pode fazer isso em um shell tipo Bourne dessa maneira:
for Package in /var/log/packages/*SBo;do
Package="$(basename $Package)"
echo "${Package%%-[0-9]*}"
done
Isso faz uso da expansão do parâmetro para remover do nome do pacote qualquer coisa após a primeira ocorrência de -
seguido por um dígito seguido por qualquer outra coisa.
E se sua localidade tiver dígitos não capturados por [0-9]
, o truque [[:digit:]]
usado na resposta de John1024 funciona aqui também. Isto é,
for Package in /var/log/packages/*SBo;do
Package="$(basename $Package)"
echo "${Package%%-[[:digit:]]*}"
done
também funciona.