ด้วย GNU awk
:
$ printf '%s\n' {foo,bar}{bar,foo} neither | gawk 'xor(/foo/,/bar/)'
foofoo
barbar
หรือพกพา:
awk '((/foo/) + (/bar/)) % 2'
ด้วยการgrep
สนับสนุน-P
(PCRE):
grep -P '^((?=.*foo)(?!.*bar)|(?=.*bar)(?!.*foo))'
ด้วยsed
:
sed '
/foo/{
/bar/d
b
}
/bar/!d'
หากคุณต้องการพิจารณาทั้งคำเท่านั้น (ที่ไม่มีfoo
หรือbar
ในfoobar
หรือ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))'
สำหรับการsed
ที่จะกลายเป็นบิตซับซ้อนจนกว่าคุณจะมีsed
การดำเนินการเช่น GNU sed
ที่สนับสนุน\<
/ \>
เป็นขอบเขตของคำเช่น GNU awk
ไม่