I want to find a list of files that have A but do not have B and C.
grep -r -L 'B\|C' finds the ones without B and C, but how do I add the condition of having A as well?
You can use negative lookahead in grep using options -P or --perl-regexp
grep -r -P -L '^(?!.*A).*$|B|C'
If I understand your question correctly:
grep -l "A" $(grep -r -E -L "B|C" *)
i.e. search for files containing "A" in the list of files that your original command generates.
If I understood your question correctly, you can do it like this:
grep "A" file.txt | grep -v -e "B" -e "C"
The first grep finds lines containing A, the second greptakes the result and removes lines containing either "B" or "C". This works by the -v flag which inverses matches.