从文件中的特定标记获取字符串值

从文件中的特定标记获取字符串值

我有一个大文件,其中包含由标签分隔的消息<>

我需要获取整个标签(带有值)。请参阅下面的示例:

<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>-m1head -n1

答案2

  1. 将标签更改为 \n 以在多行模式下工作
  2. 在多行模式下提取值并保存值以保留空间
  3. 给定最后一行,获取从保持空间到模式空间的值
  4. 用标签替换所有值并打印结果

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>

相关内容