Awk remove o campo somente se numérico

3

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).

    
por elbarna 28.10.2014 / 23:32

4 respostas

3

Você pode tentar:

ls /var/log/packages/*SBo| sed 's/-[0-9].*//'
    
por 29.10.2014 / 00:09
2

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:].]*-.*//'
    
por 28.10.2014 / 23:44
1

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"' {} \;
    
por 29.10.2014 / 01:08
1

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.

    
por 28.10.2014 / 23:57

Tags