我目前有代码
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"
答案 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 mapfile
或Bash reference manual在本地bash中阅读有关mapfile的更多信息。