【发布时间】:2017-10-28 01:19:49
【问题描述】:
我的输入如下
<connection name="test1" transport="tcp">
<LPort>host1:11111</hostPort>
<hostPort>host1:11111</hostPort>
<abcd> 1234
<connection name="test2" transport="tcp">
<hostPort>host2:22222</hostPort>
<GPort>host1:12111</hostPort>
<connection name="xyz1" transport="tcp">
<hostPort>host3:33333</hostPort>
<FPort>host1:12113</hostPort>
<efgi> 5678
<connection name="xyz2" transport="tcp">
<LPort>host1:12234</hostPort>
<hostPort>host4:4444</hostPort>
我希望我的输出如下:
test1 host1 1111
test2 host2 2222
xyz1 host3 3333
xyz2 host4 4444
为了解决这个问题,这就是我所做的并且它有效。但在我看来,一定有更好更简单的方法,我没有包括整个逻辑(数组);但是当我有多个时,我一直在使用这种方法 在文件中搜索并且它可以工作。我尝试使用 && 命令组合 awk 命令,但失败了。
以下是我的代码和逻辑的一部分 1)我 cat 文件 2)摆脱多余的字符并用空格替换使用sed 3)我取我想要的值并分配给数组值使用awk 请注意我没有包括其余的逻辑(但它有效) 简而言之,我做了一个 while 循环,然后将值分配给 2 或 3 个数组并在同一行打印它们以获得所需的输出
cat file | grep -A5 connection | sed s'/[:="><]/ /g' | awk '/name/ {print $3}'
cat file | grep -A5 connection | sed s'/[:="><]/ /g' | awk '/hostPort/ {print $2 " " $3}'
如果可能,请提供不涉及使用 sed/awk 或任何其他方式将我的搜索条件存储在数组中的替代解决方案?
如果您能提供解决方案,请提供每个选项的详细信息;如果你可以的话。
谢谢
【问题讨论】:
-
我建议使用 XML/HTML 解析器 (xmlstarlet, xmllint ...)。
-
@Cyrus,他们在这里无济于事(至少,他们应该将这种结构视为无效)-标签混乱(错位)。特别是:
LPort, GPort, FPort, abcd ... -
嗨赛勒斯,感谢您的回复。我以前从未使用过解析器,我不确定它们是否适用于此。