Với GNU awk:
$ printf '%s\n' {foo,bar}{bar,foo} neither | gawk 'xor(/foo/,/bar/)'
foofoo
barbar
Hoặc di chuyển:
awk '((/foo/) + (/bar/)) % 2'
Với sự grephỗ trợ cho -P(PCRE):
grep -P '^((?=.*foo)(?!.*bar)|(?=.*bar)(?!.*foo))'
Với sed:
sed '
/foo/{
/bar/d
b
}
/bar/!d'
Nếu bạn muốn xem xét toàn bộ chỉ từ (rằng có không phải là foohay bartrong foobarhoặc barbarchẳng hạn), bạn sẽ cần phải quyết định như thế nào những từ được phân cách. Nếu đó là bởi bất kỳ ký tự nào ngoài các chữ cái, chữ số và dấu gạch dưới như -wtùy chọn của nhiều cách grepthực hiện, thì bạn sẽ thay đổi chúng thành:
gawk 'xor(/\<foo\>/,/\<bar\>/)'
awk '((/(^|[^[:alnum:]_)foo([^[:alnum:]_]|$)/) + \
(/(^|[^[:alnum:]_)bar([^[:alnum:]_]|$)/)) % 2'
grep -P '^((?=.*\bfoo\b)(?!.*\bbar\b)|(?=.*\bbar\b)(?!.*\bfoo\b))'
Vì sedđiều đó trở nên hơi phức tạp trừ khi bạn có một sedtriển khai như GNU sed hỗ trợ \</ \>như các ranh giới từ như GNU awk.