我有一个大文件,其中包含由标签分隔的消息<>
。
我需要获取整个标签(带有值)。请参阅下面的示例:
<tvd:HostProductListStatus>000</tvd:HostProductListStatus><tvd:BeefProductListStatus>000</tvd:BeefProductListStatus><tvd:CustomerBranding>CC</tvd:CustomerBranding><tvd:InquiryAllowed>true</tvd:InquiryAllowed>
我只需要获取并显示仅有的以下标记:文件中的值,无论它是否出现多次:
<tvd:BeefProductListStatus>000</tvd:BeefProductListStatus>
这样做的命令是什么?
答案1
假设您想要发布的输入和输出,这可以使用 GNU grep 并使用名为 的文件input
:
<input grep '<tvd:BeefProductListStatus>[^<]*</tvd:BeefProductListStatus>' -o -m1 \
| head -n1
grep -o
要求仅打印匹配的部分,防止在同一行上[^<]*
匹配多个实例,并在第一个匹配行之后停止。由于同一行上有两个标记数据实例会导致 grep 输出它们中的每一个,因此需要将其修剪为仅第一个匹配项。<tvd:BeefProductListStatus>
-m1
head -n1
答案2
- 将标签更改为 \n 以在多行模式下工作
- 在多行模式下提取值并保存值以保留空间
- 给定最后一行,获取从保持空间到模式空间的值
- 用标签替换所有值并打印结果
sed -rn '
s/<tvd:BeefProductListStatus>/\n/g;
s/([^<]*).*/\1/Mg; H;
${ g; s/\n+/ /g;
s#\b(\w+)\b#<tvd:BeefProductListStatus>\1</tvd:BeefProductListStatus>\n#gp
}
' file
<tvd:BeefProductListStatus>000</tvd:BeefProductListStatus>
<tvd:BeefProductListStatus>111</tvd:BeefProductListStatus>
<tvd:BeefProductListStatus>000</tvd:BeefProductListStatus>