gpt4 book ai didi

xml - 根据搜索父叶字符串从 xml 中查找并打印特定字符串

转载 作者:太空宇宙 更新时间:2023-11-04 09:21:42 25 4
gpt4 key购买 nike

我需要根据 CentOS 服务器上的收集器名称从 xml 文件中提取所有 FCP 名称CPM 标签内的行数未知首选 bash,但适用于任何解决方案。

例子:输入文件

  <CPM display_name="XYZ"  collector="202a" >
<FCP name="a1" second_name="b2"/>
<FCP name="a3" second_name="b232323"/>
<FCP name="a2" second_name="b445"/>
</CMP>
<CPM display_name="XYZ" collector="204a" >
<FCP name="z1" second_name="b232323232"/>
<FCP name="s3" second_name="b23232323"/>
<FCP name="t2" second_name="b4453223"/>
</CMP>
<CPM display_name="XYZ" collector="202a" >
<FCP name="a11" second_name="basdasdasdasd2"/>
</CMP>

....超过 500 行的长文件。

预期输出

collector="202a"
name="a1"
name="a2"
name="a3"
name="a11"

collector="204a"
name="z1"
name="s3"
name="t2

感谢任何帮助。

最佳答案

gawk 解决方案,带有matchsubstrRSTARTRLENGTH您可以模拟 grep -o 行为,并且 A[length(A)+1]=N 模拟数组推送行为:

awk '
match($0, /collector="[^"]*"/){
collector=substr($0, RSTART, RLENGTH)
}
match($0,/[ ]name="[^"]*"/) {
d[collector][length(d[collector])+1]=substr($0, RSTART+1, RLENGTH)
}
END{
for(k in d){
print(k)
for (i in d[k]) print d[k][i]
print ""
}
}' file

编辑:谢谢,Ed Morton

awk '
match($0, /\<collector="[^"]*"/, a){ collector=a[0] }
match($0, /\<name="[^"]*"/, a){ d[collector][length(d[collector])+1]=a[0] }
END{
for(k in d){
print(k)
for (i in d[k]) print d[k][i]
print ""
}
}' file

你明白了,

collector="202a"
name="a1"
name="a3"
name="a2"
name="a11"

collector="204a"
name="z1"
name="s3"
name="t2"

奖励:非gawk 解决方案、sedgrepsorttr 函数

grep -oE '\b(collector|name)="[^"]*"' file | 
sed ':a;N;$!ba;s/\nname/ name/g' |
sort -k1 |
sed ':a;$!N;/^\([^ ]*[ ]\).*\n\1/s/\n/ /;ta;P;D' |
sed 's/[ ]collector="[^"]*"//g' |
tr ' ' '\n'

你明白了,

collector="202a"
name="a11"
name="a1"
name="a3"
name="a2"
collector="204a"
name="z1"
name="s3"
name="t2"

关于xml - 根据搜索父叶字符串从 xml 中查找并打印特定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41226602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com