-v
, который вы передали, заставляет его делать противоположное тому, что вы намереваетесь - он показывает вам для каждой строки в sitelist1.txt
все строки в sitelist2.txt
, которые не совпадают. Готов поспорить, вы видите много дубликатов. Вы хотите использовать ту же команду без параметра -v
:
fgrep -f sitelist1.txt sitelist2.txt
Это приведет к выполнению следующей английской директивы: Для каждой строки в sitelist1.txt
покажите мне все строки в sitelist2.txt
, которые содержат строку файла 1, которая меня интересует, как целую строку или как часть строки файла 2.
Параметр -v
- это параметр «инвертировать совпадение», который показывает все несовпадающие строки.
Вы можете использовать подоболочку для группировки:
if cmd1 || ( [[ "$x" == 'z' ]] && cmd2 ); then
...
else
...
fi
Работает нормально:
cmd1() { return 1; }
cmd2() { return 0; }
x=z
if cmd1 || { [[ "$x" = "z" ]] && cmd2; }; then
echo Success
else
echo Failure
fi
Success
Вы уверены, что не запускаете этот код в sh
? Это даст вам что-то вроде
sh: 4: [[: not found
Код в вопросе должен нормально работать в реальной оболочке, но я понимаю, что какая-то другая программа не сможет его проанализировать. Предполагая, что мы не можем исправить эту программу, обходной путь может состоять в том, чтобы разделить вторую часть условия на функцию:
cond2() { [[ "$x" = "z" ]] && cmd2; }
if cmd1 || cond2; then
...
Это не так кратко, но если синтаксический анализатор стоит чего-либо , он должен быть в состоянии проанализировать определение этой функции.