如何使用sed在<version.suffix>SOMETHING</version.suffix>
中获取SOMETHING?
我尝试了sed 's#.*>\(.*\)\<version\.suffix\>#\1#'
,但失败了。
答案 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>
。\(.*\)<\/[^>]*>$
捕获下一个结束标记的字符。剩余的结束标记与此<\/[^>]*>
正则表达式匹配。你的正则表达式是正确的但唯一的是,你忘了在结束标记内使用/
。
$ 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.suffix
与version\.suffix
version.suffix
的右侧与\>
>
字符保留在sed
的模式空间中并打印出来。 TL; DR - "\X"
不意味着所有X的“只匹配一个X”!