Ваша идея верна, но у вас есть пара проблем в логике. Расширение массива типа ${array[@]}
помещает содержимое массива в отдельные слова, разделенные символом пробела. Хотя вы хотели передать одну строку регулярного выражения в grep
, оболочка расширила массив до его составляющих и пытается оценить его как
grep -e '^_id=\|' '_type\|' 'date_found\|' whateverelse
, что означает, что каждая из ваших строк регулярного выражения теперь оценивается как содержимое файла, а не как строка регулярного выражения.
Таким образом, чтобы grep
обрабатывал весь ваш массив как одну строку, используйте расширение ${array[*]}
. Поскольку этот конкретный тип расширения использует символ IFS
для объединения содержимого массива, вы получаете пространство по умолчанию (значение по умолчанию IFS
) между словами, если оно не сброшено. Синтаксис ниже сбрасывает значение IFS
в под-оболочке и распечатывает содержимое расширенного массива
grep -e "$(IFS=; printf '%s' "${grep_array[*]}")" <<<"$str1"