如何将grep字符串输出到bash中的数组元素

时间:2019-06-26 17:09:02

标签: bash grep

我目前有代码

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 个答案:

答案 0 :(得分:1)

您将遇到单词拆分的问题,后者会在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

(请注意,使用process substitution代替管道。这对于防止隐式子shell占用descarray变量很重要。)

您可以使用help mapfileBash reference manual在本地bash中阅读有关mapfile的更多信息。