Combine uma linha até #, mas sem #, ao analisar um arquivo com um regex

2

Eu quero analisar meu sources.list para extrair a lista de repositórios. Eu tenho:

## Some comment
deb http://some.vendor.com/ubuntu precise stable
deb-src http://some.vendor.com/ubuntu precise stable
deb http://some.othervendor.com/ubuntu precise experimental # my current favorite

Eu quero:

http://some.vendor.com/ubuntu precise stable
http://some.othervendor.com/ubuntu precise experimental

Então, preciso: apenas linhas com "deb" no início e até o final da linha ou um caractere # , mas excluindo-o. Até agora eu tenho:

grep -o "^deb .*"

Mas como faço para corresponder # ou fim de linha sem corresponder à # ?

    
por stwissel 10.06.2012 / 16:38

2 respostas

6

Usando grep :

grep -Po '(?<=^deb\s).*?(?=#|$)' inputFiles 

Com base na @ sugestão do kopischke ,

grep -Po '(?<=^deb\s)[^#]*' inputFiles

Usando sed :

sed -nr '/^deb\s/s;^deb\s([^#]*)#?.*$;;p' inputFiles

Usando awk (esta solução é baseada no número de campos fixos):

awk '/^deb /{print $2,$3,$4}' inputFiles
por 10.06.2012 / 17:42
2

Não é necessário usar sed ou awk para uma correspondência tão simples; basta ter seu regex para capturar qualquer caractere, exceto um hash, usando uma classe de caractere negada:

grep -o "^deb [^#]*"

Se você precisar filtrar o "deb" líder, um loop simples funcionará:

while read line; do
    echo "${line#deb }"
done <(grep -o "^deb [^#]*")

Editar: uma solução mais limpa e de uma linha é usar um regex Perl com grep -P , o que permite asserções lookbehind (veja Resposta do Príncipe John Wesley ).

    
por 10.06.2012 / 18:46