Я передаю ввод в 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, чтобы передать параметры с несколькими условиями ИЛИ из другого места, а не из одной строки? Чем больше у меня аргументов, тем хуже читаемость и управляемость.

0
datacruncher 22 Мар 2019 в 14:31

1 ответ

Лучший ответ

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

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

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

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

grep -e "$(IFS=; printf '%s' "${grep_array[*]}")" <<<"$str1"
1
Inian 22 Мар 2019 в 12:17