"word1" XOR "word2"を含む行をテキストファイルから検索したいです。したがって、word1、word2を含む行を出力する必要がありますが、これら2つの単語を含む行は出力しないでください。 XORを使いたいのですが、Linuxのコマンドラインで書く方法がわかりません。
私は試した:
grep 'word1\|word2' text.txt
grep word1 word2 text.txt
grep word1 text.txt | grep word2
grep 'word1\^word2' text.txt
などがありましたが、すべて失敗しました。
ベストアンサー1
GNUの使用awk
:
$ printf '%s\n' {foo,bar}{bar,foo} neither | gawk 'xor(/foo/,/bar/)'
foofoo
barbar
または携帯用:
awk '((/foo/) + (/bar/)) % 2'
サポート(grep
PCRE -P
):
grep -P '^((?=.*foo)(?!.*bar)|(?=.*bar)(?!.*foo))'
そしてsed
:
sed '
/foo/{
/bar/d
b
}
/bar/!d'
foo
完全な単語(たとえば、nor bar
infoobar
またはin)のみを考慮する場合は、barbar
単語を分離する方法を決定する必要があります。実装された-w
多くのオプションなど、文字、数字、アンダースコアを除く文字で構成されている場合は、次のようgrep
に変更できます。
gawk 'xor(/\<foo\>/,/\<bar\>/)'
awk '((/(^|[^[:alnum:]_)foo([^[:alnum:]_]|$)/) + \
(/(^|[^[:alnum:]_)bar([^[:alnum:]_]|$)/)) % 2'
grep -P '^((?=.*\bfoo\b)(?!.*\bbar\b)|(?=.*\bbar\b)(?!.*\bfoo\b))'
/を単語境界としてサポートするGNUのような実装がsed
なければ、これは少し複雑になるからです。sed
sed
\<
\>
awk