如何使用sed获取xml值

时间:2014-09-05 14:16:58

标签: linux bash sed

如何使用sed在<version.suffix>SOMETHING</version.suffix>中获取SOMETHING?

我尝试了sed 's#.*>\(.*\)\<version\.suffix\>#\1#',但失败了。

4 个答案:

答案 0 :(得分:1)

试试这个:

sed 's/<.*>\(.*\)<.*>/\1/'

通常应该每个 xml值。

如果您需要删除缩进,请在开头添加\s*,如下所示:

sed 's/\s*<.*>\(.*\)<.*>/\1/'

或者,如果您想要version.suffix的值,则可以使命令更加具体,如下所示:

sed 's/<version\.suffix>\(.*\)<.*>/\1/'

答案 1 :(得分:1)

您可以使用以下sed命令

$ echo '<version.suffix>SOMETHING</version.suffix>' | sed 's#^<[^>]*>\(.*\)<\/[^>]*>$#\1#'
SOMETHING
  • ^<[^>]*>匹配第一个标记字符串<version.suffix>
  • \(.*\)<\/[^>]*>$捕获下一个结束标记的字符。剩余的结束标记与此<\/[^>]*>正则表达式匹配。
  • 最后,所有匹配的字符都被组索引1中的字符替换。

你的正则表达式是正确的但唯一的是,你忘了在结束标记内使用/

$ echo '<version.suffix>SOMETHING</version.suffix>' | sed 's#.*>\(.*\)</version\.suffix>#\1#'
                                                                       |<-Here
SOMETHING

答案 2 :(得分:1)

可能的方式很多,例如:

sed

echo '<version.suffix>SOMETHING</version.suffix>' | sed 's#<[^>]*>##g'

grep

echo '<version.suffix>SOMETHING</version.suffix>' | grep -oP '<version.suffix>\KSOMETHING(?=</version.suffix>)'

答案 3 :(得分:1)

假设问题的格式是准确的,当我在问题中按原样运行示例时:

$ echo '<version.suffix>SOMETHING</version.suffix>' | sed 's#.*>\(.*\)\<version\.suffix\>#\1#'

我看到以下输出:

SOMETHING</>

如果我的格式化技巧失败了,这个输出以尾随左尖括号,正斜杠,最后右尖括号结束。

那么,为什么这个“失败”呢?好吧,在我的系统上(使用GNU grep 2.14的Linux),grep(1)包含以下代码段:

反斜杠字符和特殊表达

符号\&lt;和\&gt;分别匹配单词开头和结尾的空字符串。

其他答案提出了在XML标记语法中提取值的好方法;使用它们。

我只想指出为什么原始问题中的RE在当前Linux系统上失败:一些符号不匹配实际字符,而是匹配这些支持posix扩展正则表达式的应用程序中的空边界。因此,在此示例中,源中的括号以意外方式匹配:

  • (.*)已匹配SOMETHING</,由\1反向引用
  • 打印
  • version.suffix的左侧与\<
  • 匹配
  • version.suffixversion\.suffix
  • 匹配
  • version.suffix的右侧与\>
  • 匹配
  • 尾随>字符保留在sed的模式空间中并打印出来。

TL; DR - "\X" 意味着所有X的“只匹配一个X”!