GNU ile awk
:
$ printf '%s\n' {foo,bar}{bar,foo} neither | gawk 'xor(/foo/,/bar/)'
foofoo
barbar
Veya portatif olarak:
awk '((/foo/) + (/bar/)) % 2'
Bir ile grep
için birlikte destek -P
(PCRE):
grep -P '^((?=.*foo)(?!.*bar)|(?=.*bar)(?!.*foo))'
İle sed
:
sed '
/foo/{
/bar/d
b
}
/bar/!d'
Yalnızca tam kelimeleri dikkate almak istiyorsanız ( foo
ne bar
içinde ne de içinde foobar
veya ne olduğunu yoktur barbar
), bu kelimelerin nasıl sınırlandırıldığına karar vermeniz gerekir. Harfler, rakamlar ve alt çizgi -w
dışında birçok grep
uygulamanın seçeneği gibi bir karaktere sahipse, bunları şu şekilde değiştirebilirsiniz:
gawk 'xor(/\<foo\>/,/\<bar\>/)'
awk '((/(^|[^[:alnum:]_)foo([^[:alnum:]_]|$)/) + \
(/(^|[^[:alnum:]_)bar([^[:alnum:]_]|$)/)) % 2'
grep -P '^((?=.*\bfoo\b)(?!.*\bbar\b)|(?=.*\bbar\b)(?!.*\bfoo\b))'
İçin sed
size bir yoksa biraz karışık hale sed
GNU gibi uygulanmasını sed
desteklediği bu \<
/ \>
GNU gibi kelime sınırları olarak awk
yapar.