Исходное выражение grep из массива - PullRequest
0 голосов
/ 22 марта 2019

Я передаю ввод в grep из ранее объявленной переменной, которая содержит несколько строк. Моя цель - извлечь только определенные строки. Когда я увеличиваю количество аргументов в grep, читаемость снижается.

var1="
_id=1234
_type=document
date_found=988657890
whateverelse=1211121212"


echo "$var1"

_id=1234
_type=document
date_found=988657890
whateverelse=1211121212


grep -e 'file1\|^_id=\|_type\|date_found\|whateverelse' <<< $var1
_id=1234
_type=document
date_found=988657890
whateverelse=1211121212

Моя идея состояла в том, чтобы передать параметры из массива, и это повысит читабельность:

declare -a grep_array=(
"^_id=\|"
"_type\|"
"date_found\|"
"whateverelse"
)

echo ${grep_array[@]}
^_id=\| _type\| date_found\| whateverelse


grep -e '${grep_array[@]}' <<<$var1

---- no results

Как я могу сделать это с помощью grep для передачи параметров с несколькими условиями ИЛИ откуда-то еще, а не одной строкой? Поскольку у меня больше аргументов, читаемость и управляемость снижаются.

1 Ответ

1 голос
/ 22 марта 2019

Ваша идея верна, но у вас есть пара проблем в логике. Расширение массива типа ${array[@]} помещает содержимое массива в отдельные слова, разделенные символом пробела. Хотя вы хотели передать одну строку регулярного выражения в grep, оболочка расширила массив до его составляющих и пытается оценить его как

grep -e '^_id=\|' '_type\|' 'date_found\|' whateverelse

, что означает, что каждая из ваших строк регулярного выражения теперь оценивается как содержимое файла, а не как строка регулярного выражения.

Таким образом, чтобы grep обрабатывал весь ваш массив как одну строку, используйте расширение ${array[*]}. Поскольку этот конкретный тип расширения использует символ IFS для объединения содержимого массива, вы получаете пространство по умолчанию (значение по умолчанию IFS) между словами, если оно не сброшено. Синтаксис ниже сбрасывает значение IFS в под-оболочке и распечатывает содержимое расширенного массива

grep -e "$(IFS=; printf '%s' "${grep_array[*]}")" <<<"$str1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...