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" 

この値(および、文字列が1つの長い複数行の文字列の場合は通常2つの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

XML クエリ言語であるXPathを使用することをお勧めします。Perl XML::XPathモジュールがインストールされている場合は、シェルで次のコマンドを使用するだけです。

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