Remover linhas correspondentes à string no grep

2

Eu tenho alguns arquivos de configuração longos para passar, e eu gostaria de ver apenas o que está realmente ativo no arquivo .conf , sem nenhuma das tags # . O que posso usar para produzir as linhas sem a # ? Estou executando o Debian Wheezy com este comando.

    
por Canadian Luke 20.08.2013 / 18:00

2 respostas

2

Se o arquivo tiver o nome foo.conf :

grep -E '^[^#].*' foo.conf deve fazê-lo.

Explicação:

-E : suporta expressões regulares estendidas!

'^[^#].*' : uma expressão regular entre aspas simples.

^[^#].* : a expressão regular em si.

^ (na posição 0 da expressão regular): "Correspondência começando no início de uma linha / primeiro caractere imediatamente após uma nova linha ou o primeiro caractere do próprio arquivo."

[^#] : Says "Combine exatamente um caracter que não seja o caractere # ."

.* : Diz "Corresponda zero ou mais de qualquer caracteres, exceto uma nova linha, para o resto da linha."

O efeito líquido é que, se você tiver um arquivo com conteúdo como o seguinte:

#foo
bar
#baz
fly

Essa expressão regular não corresponderá à primeira e terceira linhas, porque o primeiro caractere no início das linhas 1 e 3 é, na verdade, um # , portanto, a parte da expressão regular que requer que exatamente um não # ( [^#] ) não corresponda, por isso grep exclui essa linha.

A expressão regular será então bem-sucedida para corresponder ao restante das linhas, porque o primeiro caractere no início das linhas 2 e 4 é de fato não a # .

Com base no nosso sucesso até agora, você também pode combinar linhas como:

    #I am tricky!

(Observe que há espaços em branco (guias ou espaços) na frente do comentário e, como ainda é um comentário, não queremos isso!)

usando o seguinte:

grep -P '^\s*+[^#].*' foo.conf

(mas o .* não é estritamente necessário; eu sei, eu sei.)

Então agora temos:

-P : suporte expressões regulares compatíveis com Perl ! (Dica: pode não estar disponível universalmente em todas as versões / implementações de grep , mas pelo menos está disponível por um tempo agora no GNU Grep.)

\s*+ : O pouco de regex adicionado que diz: "Corresponda zero ou mais caracteres de espaço em branco, o que significa espaços ou tabulações, e se você fizer vê-los, DEVE COMER-los." Esta última parte é muito importante, porque sem o quantificador possessivo *+ , o espaço poderia corresponder como parte do [^#] , o que traria a expressão regular. Os quantificadores possessivos não existem em expressões regulares POSIX Compatible (Basic ou Extended), portanto, temos que usar o PCRE aqui. Pode haver uma maneira de fazer isso sem um quantificador possessivo, mas eu não estou ciente disso.

    
por 20.08.2013 / 18:04
4
grep -v '#' file

Você precisa citar o # porque seu shell também pode interpretar isso como um comentário.

O grep irá remover qualquer linha com #. Isso pode não ser o que você quer. O que pode ser mais útil é remover os comentários. Você pode usar sed ou o "Stream EDitor". Isso pode dar o que você quer.

sed -e 's/#.*//' < file | less

A expressão regular diz "encontre de um caractere de comentário até o final da linha e remova-o", em seguida canalize para menos para ler mais facilmente.

Se os comentários estiverem sempre na primeira coluna, você pode usar o método como escrito por @somequixotic, que mostra apenas as linhas onde não há comentários na primeira coluna.

    
por 20.08.2013 / 18:03

Tags