grep para string sem outra string antes dela

0

Encontrei muitos guias para ignorar linhas com comentários ou correspondência para uma sequência, mas não para outra, mas não encontrei o que preciso. Eu quero grep recursivamente para arquivos contendo a string "índices" (caso insensível eu acho, é conf apache) mas não um "#" ANTES.

Deve corresponder a isto:

Options Indexes
Options +Indexes
Options Indexes MultiViews
Options Indexes # Comment
Options Indexes # Indexes

Mas não é isso:

Options MultiViews # Indexes
# Indexes yadayada Indexes

Estou usando em um script no formulário:

if grep -re "[^#]*ndexes" $DIR1/httpd.conf $DIR2/http; then
    echo Do not use Indexes
fi

O acima é um dos meus esforços, mas não consigo fazê-lo funcionar.

    
por Broman 20.06.2017 / 17:18

1 resposta

3

Dada essa entrada:

Options Indexes
Options +Indexes
Options Indexes MultiViews
Options Indexes # Comment
Options Indexes # Indexes
Options MultiViews # Indexes
# Indexes yadayada Indexes

Isso parece funcionar:

$ grep '^[^#]*Indexes' input
Options Indexes
Options +Indexes
Options Indexes MultiViews
Options Indexes # Comment
Options Indexes # Indexes
$ grep -v '^[^#]*Indexes' input
Options MultiViews # Indexes
# Indexes yadayada Indexes

Para dissecar a expressão regular:

  • ^ - Início da linha
  • [^#]* - Zero ou mais de qualquer caractere que não seja um octothorpe
  • Indexes - A string literal Indexes

Para colocar no contexto do seu script:

if grep -rl -- '^[^#]*Indexes' "$DIR1/httpd.conf" "$DIR2/http"; then
    echo "The above-listed files use an 'Indexes' directive."
fi
    
por 20.06.2017 / 17:31