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
जीएनयू तरह कार्यान्वयन sed
कि समर्थन करता है \<
/ \>
जीएनयू की तरह शब्द सीमाओं के रूप में awk
करता है।