Você não pode combinar correspondências inversas e avançadas em uma invocação grep
Você pode fazer isso com sed
:
sed -e '/^www\./d' -e '/\//d' -e '/^[^.]*\.[^.]*$/!d' ./*.txt
Ou awk
(que, ao contrário de sed
, seria capaz de imprimir o nome do arquivo correspondente como grep
):
awk -F. 'NF == 2 && !/^www\./ && !/\// {print FILENAME": "$0}' ./*.txt
Você pode fazer isso com duas invocações grep, desde que não queira que os nomes dos arquivos sejam impressos:
cat ./*.txt | grep '^[^.]*\.[^.]*$' | grep -v -e / -e '^www\.'
Aqui, usando cat
para alimentar o conteúdo de todos os arquivos em stdin, então o primeiro grep
não imprime os nomes dos arquivos. Algumas implementações grep
têm grep -h
para ignorar a impressão dos nomes dos arquivos, se houver mais de um arquivo. No caso de apenas um nome de arquivo, grep
não imprime o nome do arquivo, e você pode alimentá-lo em seu stdin com redirecionamentos:
<onefile.txt grep '^[^.]*\.[^.]*$' | grep -v -e / -e '^www\.'
Você poderia implementar a negação com os operadores de look-ahead% PC_de% negativos do PCRE se o seu (?!...)
for compatível com grep
:
grep '^(?!www\.)(?!.*/)[^.]*\.[^.]*$' ./*.txt
Mas aqui, você poderia fazer tudo com -P
com:
grep -v -e / -e '^www\.' -e '^[^.]*$' -e '\..*\.'
Isso também exclui linhas que não contenham pontos nem linhas que contenham mais de um ponto.