我有一个受限制的bash (在其他工具中有grep和sed,但没有awk),我试图使用它来快速自动化一些日常工作。我目前正在使用"grep keyword filename -b3“,我想知道如何在我有限的工具中更有效地做到这一点。
对于一个XML文件,如何使用bash to grep表示符号"111AA2026",获取匹配行上面3行的“记录”名称,包括匹配行本身:
<record name="111111H2" />
<items>
<field name="Electronic Identifier" value="1"/>
<field name="Symbol" value="111AA2026"/>
<field name="Full Symbol" value="111AA202622MARFUT"/>
<field name="System Identifier" value="1"/>
<field name="System Identifier Description" value="Description"/>
</items>
<record name="111111N1" />
<items>
<field name="Electronic Identifier" value="2"/>
<field name="Symbol" value="111AA2026"/>
<field name="Full Symbol" value="111AA202621JULFUT"/>
<field name="System Identifier" value="2"/>
<field name="System Identifier Description" value="Description"/>
</items>
<record name="111111Q1" />
<items>
<field name="Electronic Identifier" value="3"/>
<field name="Symbol" value="111AA2026"/>
<field name="Full Symbol" value="111AA202621AUGFUT"/>
<field name="System Identifier" value="3"/>
<field name="System Identifier Description" value="Description"/>
</items>
<record name="111111U1" />
<items>
<field name="Electronic Identifier" value="4"/>
<field name="Symbol" value="111AA2026"/>
<field name="Full Symbol" value="111AA202621SEPFUT"/>
<field name="System Identifier" value="4"/>
<field name="System Identifier Description" value="Description"/>
</items>
<record name="111111Z1" />
<items>
<field name="Electronic Identifier" value="5"/>
<field name="Symbol" value="111AA2026"/>
<field name="Full Symbol" value="111AA202621DECFUT"/>
<field name="System Identifier" value="5"/>
<field name="System Identifier Description" value="Description"/>
</items>请注意,在实际文件中有多个不同的"Symbol“值
样本输出
<record name="111111H2" />
<field name="Symbol" value="111AA2026"/>
--
<record name="111111N1" />
<field name="Symbol" value="111AA2026"/>
--
<record name="111111Q1" />
<field name="Symbol" value="111AA2026"/>
--
<record name="111111U1" />
<field name="Symbol" value="111AA2026"/>
--
<record name="111111Z1" />
<field name="Symbol" value="111AA2026"/>我遇到的关键挑战是获得一个匹配结果,它给出了匹配的行和上面的3行,而不是关于如何获取XML文件的属性
发布于 2021-07-19 17:15:45
不确定这是否是您要查找的内容,但它输出的内容与您在示例输出中给出的内容非常相似。
cat temp.xml \
| grep -B3 '"111AA2026"' \
| sed -n '/<record/p;/"Symbol/p'# The -n flag disables printing of all lines, which is what sed
# does by default, so we need to handle printing ourselves using
# the "p" command.
sed -n '
# [p]rint all lines that contain: <record
/<record/ p
# [p]rint all lines that contain: "Symbol
/"Symbol/ p
'发布于 2021-07-19 18:21:39
这可能适用于您(GNU sed):
sed -nE '/record/{:a;N;/Symbol/!ba;/111AA2026/s/(\n).*(\1.*)/\2\1--/p}' file收集record和Symbol之间的行,如果这些行包含文字111AA2026,则打印集合的第一行和最后一行以及分隔符--。
仅使用grep的替代方法:
grep -B3 '111AA2026' file | grep 'record\|"Symbol"\|--'发布于 2021-07-19 17:21:02
grep 'record\|"Symbol"' $filegrep 'record\|"Symbol"' $file
<record name="111111H2" />
<field name="Symbol" value="111AA2026"/>
<record name="111111N1" />
<field name="Symbol" value="111AA2026"/>
<record name="111111Q1" />
<field name="Symbol" value="111AA2026"/>
<record name="111111U1" />
<field name="Symbol" value="111AA2026"/>
<record name="111111Z1" />
<field name="Symbol" value="111AA2026"/>https://stackoverflow.com/questions/68437818
复制相似问题