2

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

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" 

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

谢谢。

4

3 回答 3

2

这可能对您有用(GNU sed):

sed '/<sessionId>/!d;s//\n/;s/[^\n]*\n//;:a;$!{/<\/sessionId>/!N;//!ba};y/\n/ /;s/<\/sessionId>/\n/;P;D' file
于 2012-09-18T06:03:45.773 回答
1

像这样的东西会起作用:

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

第一部分是因为 sed 在匹配时尝试尽可能多地吃掉一行,这将找到所有sessionId出现的地方并自行将它们分成一行。

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

于 2012-09-17T23:42:40.993 回答
0

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

xpath -q -e '//sessionId/text()' <input_file>
于 2012-09-17T23:46:05.940 回答