使用SED在XML标记之间提取值

时间:2012-09-17 23:26:25

标签: c# windows sed grep

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

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

如何从此字符串中提取值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" 

如何提取此值(当字符串为1,长多行字符串时,通常是两个XML标记之间的值)?

感谢。

3 个答案:

答案 0 :(得分:2)

这可能适合你(GNU sed):

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

答案 1 :(得分:1)

这样的事情会起作用:

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

第一部分是因为sed在匹配时尝试尽可能多地占用一行,这将找到所有sessionId个出现并将它们分开在一条线上。

下一部分匹配sessionId标记之间的内容。

答案 2 :(得分:0)

我建议使用XPath,这是一种XML查询语言。如果您安装了Perl XML::XPath模块,那么您只需在shell中使用以下命令:

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