O problema é que grep -v
corresponderá a linhas que não correspondem à expressão, e não a arquivos que não correspondem a ela ...
Portanto, se o arquivo tiver qualquer linhas que não correspondam a ele, grep -v
corresponderá a essas linhas e, assim, o grep retornará com êxito.
Uma abordagem melhor é usar uma correspondência positiva para a palavra-chave e usar ||
(em vez de &&
) para anexar a linha, se necessário:
grep -q "keyword" /a/b/c.conf || echo "abc keyword" >> /a/b/c.conf
Você provavelmente fez seu teste com echo "the line is absent"
para dizer que estava ausente quando estava realmente ausente ... E talvez não fazer nada se essa fosse a única linha . Se você testar isso ainda mais, acho que verá que, desde que tenha linhas que não correspondam à palavra-chave, você obterá uma correspondência.
Espero que isso o esclareça!