使用 sed 将字符串中的多次出现提取到数组中?

vin*_*nod 1 bash shell sed

如何使用 sed 将所有匹配项放入 Bash 数组?

我的输入是

<node><system_id>app1261.works.com</system_id><name>app1261</name></node><node><system_id>app1361.works.com</system_id><name>app1361</name></node><node><system_id>app1461.works.com</system_id><name>app1461</name></node>
Run Code Online (Sandbox Code Playgroud)

预期输出存储在数组中

app1261.works.com 
app1361.works.com 
app1461.works.com 
Run Code Online (Sandbox Code Playgroud)

我正在尝试下面的命令,但它总是返回最后一个匹配项而不是所有匹配项。

sed -ne '{s/.*<system_id>\(.*\)<\/system_id>.*/\1/p;q;}' <<< "$xml"
Run Code Online (Sandbox Code Playgroud)

谁能帮我这个?

anu*_*ava 5

如果你有gnu grep然后使用这个基于环视的解决方案:

grep -Po '(?<=<system_id>)[^<>]+(?=</system_id>)' <<< "$xml
app1261.works.com
app1361.works.com
app1461.works.com
Run Code Online (Sandbox Code Playgroud)

否则,一个grep + sed解决方案:

grep -Eo '<system_id>([^<>]+)</system_id>' <<< "$xml | 
sed -E 's~</?system_id>~~g'

app1261.works.com
app1361.works.com
app1461.works.com
Run Code Online (Sandbox Code Playgroud)