5

&の間のデータと<cookie>&</cookie>の間のデータ(末尾の引用符)に対してこのコードをフィルタリングしようとしています。account-id=""

<?xml version="1.0" encoding="utf-8"?>
<results>
 <status code="ok"/>
 <common locale="en" time-zone-id="85">
  <cookie>na3breezfxm5hk6co2kfzuxq</cookie>
  <date>2012-11-11T16:26:52.713+00:00</date>
  <host>http://meet97263421.adobeconnect.com</host>
  <local-host>pacna3app09</local-host>
  <admin-host>na3cps.adobeconnect.com</admin-host>
  <url>/api/xml?action=common-info</url>
  <version>8.2.2.0</version>
  <tos-version>7.5</tos-version>
  <product-notification>true</product-notification>
  <account account-id="1013353222"/>
  <user-agent>curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5</user-agent>
 </common>
</results>

どんな助けでも大歓迎です。

編集

これは、上記の xml を返すために実行する curl コマンドです。

curl -s http://meet97263421.adobeconnect.com/api/xml?action=common-info
4

3 に答える 3

9

一般に、正規表現 (したがってgrep)は XML の解析には適していませんが、入力が整形式で一貫性があることを保証できる場合は、grepの perl スタイルの正規表現を使用して最も簡単にこれを行うことができます (grep が彼ら):

grep -oP '(?<=<cookie>).*?(?=</cookie>)'
grep -oP '(?<=account-id=").*?(?=")'

それらを同じコマンドに入れたい場合は、それらを で区切ることができますが、|どの一致がどれであるかを区別する必要があります。

grep -oP '(?<=<cookie>).*?(?=</cookie>)|(?<=account-id=").*?(?=")'
于 2012-11-11T17:05:20.770 に答える
5

@Kevin で述べたように、正規表現は XML の解析には適していません。

より良いアプローチは、次のように xpath 式を適用するxmllintプログラムを使用することです。

$ xmllint --xpath "string(/results/common/cookie)" data.xml
na3breezfxm5hk6co2kfzuxq

$ xmllint --xpath "string(/results/common/account/@account-id)" data.xml
1013353222
于 2012-11-11T20:18:44.097 に答える
0

これらの XPath 式を使用します

/results/common/cookie

/results/common/account/@account-id

コマンドライン XPath インタープリターを使用する

于 2012-11-11T20:16:28.133 に答える