Dengan GNU awk
:
$ printf '%s\n' {foo,bar}{bar,foo} neither | gawk 'xor(/foo/,/bar/)'
foofoo
barbar
Atau mudah dibawa:
awk '((/foo/) + (/bar/)) % 2'
Dengan grep
dukungan untuk -P
(PCRE):
grep -P '^((?=.*foo)(?!.*bar)|(?=.*bar)(?!.*foo))'
Dengan sed
:
sed '
/foo/{
/bar/d
b
}
/bar/!d'
Jika Anda ingin mempertimbangkan seluruh kata saja (bahwa tidak ada foo
atau tidak ada bar
dalam foobar
atau barbar
misalnya), Anda harus memutuskan bagaimana kata-kata itu dibatasi. Jika dengan karakter apa pun selain huruf, angka, dan garis bawah seperti -w
opsi banyak grep
implementasi, maka Anda akan mengubahnya menjadi:
gawk 'xor(/\<foo\>/,/\<bar\>/)'
awk '((/(^|[^[:alnum:]_)foo([^[:alnum:]_]|$)/) + \
(/(^|[^[:alnum:]_)bar([^[:alnum:]_]|$)/)) % 2'
grep -P '^((?=.*\bfoo\b)(?!.*\bbar\b)|(?=.*\bbar\b)(?!.*\bfoo\b))'
Untuk sed
itu menjadi sedikit rumit kecuali jika Anda memiliki sed
implementasi seperti GNU sed
yang mendukung \<
/ \>
sebagai batas kata seperti GNU awk
.