Как получить вывод строки grep для элементов массива в bash - PullRequest
1 голос
/ 26 июня 2019

У меня в настоящее время есть код

descarray=($(grep -oP "(?<=description\"\:)(.*?)(?=\}})" descfile.json))

, но когда я пытаюсь это сделать, я получаю совпадение правильно, но так как это строка с пробелом, она отделяет каждое слово как элемент массива.

Пример строки, которая будет соответствовать:

"*No_Request_Validation* issue exists @ some other information here""another example goes here"

, но я получу

"*No_Request_Validation*
issue
exists
@
some
...

В начале и в конце каждого обязательного элемента есть кавычки, и я быхотел бы разделить их с этим.например:

descarray[0]: "*No_Request_Validation* issue exists @ some other information here"
descarray[1]: "another example goes here"

1 Ответ

1 голос
/ 26 июня 2019

Вы столкнулись с разделением слов, которое разбивает токены на IFS, которое по умолчанию включает переводы строки, табуляции и пробелы. Чтобы прочитать вывод команды grep в массив, разделенный символами новой строки, рассмотрим mapfile:

mapfile -t descarray < <(grep -oP "(?<=description\"\:)(.*?)(?=\}})" descfile.json))

Например,

$ mapfile -t foo <<< '1 2 3
4 5 6'
$ echo "${#foo[@]}"  # we should see two members in the array
2
$ echo "${foo[1]}"  # The second member should be '4 5 6'
4 5 6

(Обратите внимание на использование подстановки процесса вместо канала. Это важно для того, чтобы неявный подоболочек мог съесть вашу переменную descarray.)

Вы можете узнать больше о mapfile в вашем локальном bash, используя help mapfile, или в справочном руководстве Bash .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...