Desejo procurar linhas com 'palavra1' XOR 'palavra2' em um arquivo de texto. Portanto, ele deve produzir linhas com palavra1, palavra2, mas não as linhas com essas duas palavras. Eu queria usar o XOR, mas não sei como escrever isso na linha de comando do Linux.
Eu tentei:
grep 'word1\|word2' text.txt
grep word1 word2 text.txt
grep word1 text.txt | grep word2
grep 'word1\^word2' text.txt
e muitos mais, mas não conseguiu obter sucesso.
Com GNU
awk
:Ou portabilidade:
Com um
grep
com suporte para-P
(PCRE):Com
sed
:Se você quiser considerar apenas palavras inteiras (que não há
foo
nembar
emfoobar
oubarbar
por exemplo), você precisa decidir como essas palavras são delimitadas. Se for por qualquer caractere diferente de letras, dígitos e sublinhado, como a-w
opção de muitasgrep
implementações, você os alteraria para:Pois
sed
isso se torna um pouco complicado, a menos que você tenha umased
implementação como o GNUsed
que suporte\<
/\>
como limites de palavras como o GNUawk
.grep 'word1\|word2' text.txt
procura por linhas contendoword1
ouword2
. Isso inclui linhas que contêm ambos.grep word1 text.txt | grep word2
procura por linhas contendoword1
eword2
. As duas palavras podem se sobrepor (por exemplo ,foobar
contémfoo
eob
). Outra maneira de pesquisar linhas contendo ambas as palavras, mas apenas de maneira não sobreposta, é procurá-las em qualquer ordem:grep 'word1.*word2\|word2.*word1' text.txt
grep word1 text.txt | grep -v word2
procura por linhas contendo,word1
mas nãoword2
. A-v
opção diz ao grep para manter as linhas não correspondentes e remover as linhas correspondentes, em vez do contrário. Isso lhe dá metade dos resultados que você queria. Ao adicionar a pesquisa simétrica, você obtém todas as linhas que contêm exatamente uma das palavras.Como alternativa, você pode começar pelas linhas que contêm uma das palavras e remover as linhas que contêm as duas palavras. Dados os blocos de construção acima, isso é fácil se as palavras não se sobrepõem.
Uma solução bash:
Para testar: