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.