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?
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.
B or C in it.You can use negative lookahead in grep using options -P or --perl-regexp
grep -r -P -L '^(?!.*A).*$|B|C'
B-l option and show me match stringA but it doesn't check if it has either B or Cgrep -r -P -L '^(?!.*lower\.html).*$|DetVehicle|customer'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.
grep -r -l "lower\.html" | grep -v -e "DetVehicle" -e "customer" and it return a list of files that have lower but they also have either Vehicle or customer