用SED提取XML标签之间的值

我以下列格式从服务器接收数据:

gin</type><sessionId>1601</sessionId><directory><default>DepthOfBook</default><study type="DepthOfBook"/ 

我怎样才能从这个string中提取值1601? 我一直在尝试以下方法,但是我错过了正确的SED语法:

  sed -n "/sessionId/,/\/sessionId/p" sed -e "s/<sessionId/\n/g"| sed -n "/sessionId/,/\/sessionId/p" sed -e "s/</\n/g"| sed -n "/sessionId/,/sessionId/p" 

我怎样才能提取这个值(当string是一个长的多行string时,通常是两个XML标签之间的值)?

谢谢。

像这样的东西可以工作:

  sed -e 's/<\/sessionId>/<\/sessionId>\n/g' | sed -n 's/.*<sessionId>\([^<]*\)<\/sessionId>.*/\1/p' 

第一部分是因为sed在匹配的时候尝试尽可能地多吃一行,这会找到所有的sessionId ,并将它们自己分开。

下一部分匹配sessionId标签之间的东西。

这可能适用于你(GNU sed):

 sed '/<sessionId>/!d;s//\n/;s/[^\n]*\n//;:a;$!{/<\/sessionId>/!N;//!ba};y/\n/ /;s/<\/sessionId>/\n/;P;D' file 

我建议使用XPath ,这是一种XML查询语言。 如果你安装了Perl XML :: XPath模块,那么你可以简单地在你的shell中使用下面的命令:

 xpath -q -e '//sessionId/text()' <input_file>