Исходя из идеи, обсужденной с Огузом Исмаилом на основе его ответа:
Независимо от того, используете ли вы grep -e
или sed для идентификации сохраняемых файлов, проблема в том, что в обоих случаях элементы ваши array
интерпретируются как регулярное выражение. Например, у вас есть один элемент массива .a
, и в качестве регулярного выражения это будет означать, что он будет соответствовать любому файлу, содержащему букву «a», кроме start имени файла. Следовательно, строка main.c
также будет соответствовать шаблону .a
.
Одна из возможностей - использовать сопоставление с подстановочными знаками вместо сопоставления с регулярным выражением, но это означает, что вам нужно явно l oop через ваш array
: Например, чтобы проверить, будет ли строка $line
удалена или должна быть сохранена, вам нужно будет сделать что-то вроде:
line_matches_pat=no
for pat in "${array[@]}"
do
if [[ $line == *$pat ]]
then
line_matches_pat=yes
break
fi
done
Если $line_matches_pat
равно yes
, строка соответствует одному из шаблонов в массиве.
IMO более разумным и гибким подходом было бы хранить в array
не расширения файлов, а регулярные выражения для интересующих вас файлов Это позволяет вам однажды поместить в список что-то вроде имен файлов, содержащих строку error_
и имеющих расширение .c
. Когда вы это сделаете, вы можете использовать подход, аналогичный решению, предложенному @oguzismail, но, конечно, вы больше не можете использовать -F
с grep:
grep -E -v "${array[*]}" copyright
Это включает расширенные регулярные выражения. Отбросьте -E
, если вас устраивают простые регулярные выражения.