使用sed获取XML中第n次出现的标记的TagValue

使用sed获取XML中第n次出现的标记的TagValue,sed,Sed,我的xml 123 959595 1233 季吉 我需要使用sed获取属性标记第二次出现的标记值,即9595 我使用了命令 <?xml version="1.0" encoding="UTF-8" ?> <Attributes> <Attribute>123</Attribute> <Attribute>959595</Attribute> <Attribute>1233</Attri

我的xml


123
959595
1233
季吉
我需要使用sed获取属性标记第二次出现的标记值,即9595

我使用了命令

<?xml version="1.0" encoding="UTF-8" ?>
<Attributes>
   <Attribute>123</Attribute>
   <Attribute>959595</Attribute>
   <Attribute>1233</Attribute>
   <Attribute>jiji</Attribute>
</Attributes>

sed-n:a;$!{N;ba};正确的方法是:

sed -n ':a;$!{N;ba};s#\(<Attribute\)\(.*\)\(</Attribute>\)#\1#2#\2#p' file
笔记
  • xmllint
    附带
    libxml2
  • “2”是第二个搜索的元素
    • sed-n'//,\ \{
      // {
      H、 g
      s.*\(.\).*\1#
      找不到
      }
      B
      :找到
      p、 q
      }“你的档案
      
      • 假设像在示例中一样,只需要找到1个属性,此sed只返回第一个属性。(如果xml内容与示例类似,则不需要选择
        /,\\\\\\
      • Posix版本so
        ——GNU上的Posix

      此sed打印属性块中的所有属性条目,然后获取第二个条目并删除标记:

      sed-n'/,\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

      sed -n '/<Attributes>/,\#</Attributes># {
        /<Attribute>/ {
           H;g
           s#.*<Attribute>\(.*\)</Attribute>.*#\1#
           t found
           }
         b
      :found
         p;q
         }' YourFile
      
      或者另一种不使用管道的方法是使用sed命令,这将转到第二个条目,去掉属性标记,然后退出:

      sed-n'//,\\\\\\\\{/{n;s\\.*(.*).*.\\\1#p;q}attrib.txt

      或者,如果属性条目的数量发生变化,您可以通过解析所有值,然后使用sed在需要的位置打印属性位置,使其更加直观:

      sed-n'//,\\\\\\\\\\\\\/{s\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


      您可以将结束位置从2更改为要显示的任何属性值字段,或采用多个值,如
      sed-n'2p;3p'
      sed-n'1,2p'

      我也将采用xmllint xpath方式。不过,似乎有两个版本可用。根据该手册页上的内容,没有xpath参数,但它被称为“模式”

      根据此文档,您的呼叫将是

      Output: 
         959595
      

      我建议检查您的本地手册页,看看要使用哪一个。

      我更愿意使用支持XML的命令行工具-例如,如果您在上面加上一个n,您将得到下一个条目(我认为这是OP想要的):sed-n'/,\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 1\\\\\\\\\\\\}b:发现p;q}'attrib.txt不相同。
      n
      将无条件地将下一行添加到工作缓冲区(除非最后一行)这可能不是什么,这就是为什么我过滤并使用holding Buffer我在我的系统上测试了它,它可以工作。您已经为语句打开了/Attribute/addressing,所以您可能不需要太多其他东西。使用
      123
      或简单地使用
      1
      内容进行测试(所有标记之间都有新行)我使用了OP中的测试数据,他想要的是第二个属性条目,而不是第一个。
      Output: 
         959595
      
      $ xmllint --pattern '/Attributes/Attribute[2]/text()' file.xml