shell 将grep结果作为单独的条目添加到数组或列表中

oymdgrw7  于 2023-08-07  发布在  Shell
关注(0)|答案(1)|浏览(145)

我有一个类似的问题,这些案件:
Set a grep result into multiple variables
Append string on grep multiple results with variable in a single command
但我不能接受他们的解决方案,并充分加以调整
我有一个查询,返回的网址列表,网址是统一格式,每个网址包含一个3位数的结束
我已经把一个例子复制到一个文件里

"url": "https://dev.azure.com/example/5121186b-6db9-49f7-8fcd-64e88a5c606d/_apis/build/Builds/238",
"url": "https://dev.azure.com/example/5121186b-6db9-49f7-8fcd-64e88a5c606d/_apis/build/Builds/239",
"url": "https://dev.azure.com/example/5121186b-6db9-49f7-8fcd-64e88a5c606d/_apis/build/Builds/240",
"url": "https://dev.azure.com/example/5121186b-6db9-49f7-8fcd-64e88a5c606d/_apis/build/Builds/241",

字符串
我试图抓住每个网址的末尾的3位数的构建号
这可以从命令行使用

(grep _apis/build/Builds build.txt | cut -d "/" -f9 | grep -Eo '[0-9]*')

238
239
240
241


但是,如果我试图将每个值捕获到一个变量数组(list?),我可以稍后循环,它出错了

queued_builds="$(grep _apis/build/Builds build.txt | cut -d "/" -f9 | grep -Eo '[0-9]*')"


如果我打印整个$queued_builds数组,它看起来没问题吗?

echo "${queued_builds[@]}"
238
239
240
241


但是如果我打印出$queued_builds,看起来它们都是作为一个单独的项目/字符串添加的,它们之间有换行符?

printf '%q\n' "$queued_builds[@]"

238$'\n'239$'\n'240$'\n'241


如果我试图访问一个特定的行/条目,我会从每个字符串中获得单个字符,而不是整个字符串?

echo $queued_builds[1]
2

echo $queued_builds[2]
3

echo $queued_builds[3]
8

etc.


我尝试将每个结果/行作为var条目,因此

echo $queued_builds[1]
238

echo $queued_builds[2]
239

echo $queued_builds[3]
240

etc.


我需要这个,因为我稍后想使用以下代码循环每个构建ID:

for build in ${queued_builds[@]}; do echo "https://dev.azure.com/${organization}/${project}/_apis/build/builds/$build?api-version=7.0"; done


我是否需要对变量的结果赋值做一些特定的事情来使每个结果成为一个新的数组项(或列表项,数组与列表在这一点上仍然有点混乱)?
多谢了

jdzmm42g

jdzmm42g1#

以下是使用SED的解决方案:

declare -a queued_builds

queued_builds=( $(sed -e '/_apis\/build\/Builds/!d' -e 's/^.\+\/\([0-9]\{3\}\)",$/\1/' build.txt) )

length="${#queued_builds[@]}"

echo "there are $length elements in queued_builds"

for ((i = 0; i < $length; ++i ))                                                                                                                                                               
do echo "element $i: ${queued_builds[$i]}"
done

字符串
输出量:

there are 4 elements in queued_builds
element 0: 238
element 1: 239
element 2: 240
element 3: 241


希望能帮上忙。

相关问题