2017-03-24 6 views
0

私はURLから値を取得するbashスクリプトを使用することだし、それはHTMLタグ形式で値を返すです。入力:所望の出力は、上記のコードから<td>タグ間の値と変数に格納されるべきシェルスクリプトのタグ間でデータを抽出し、配列に格納しますか?

<tr><td title='The name of the health check service.'>hc.name</td><td data-type='java.lang.String'>Replication Queue</td></tr> 
<tr><td title='The persistence identifier of the service.'>service.pid</td><td data-type='java.lang.String'>com.adobe.granite.replication.hc.impl.ReplicationQueueHealthCheck</td></tr> 
<tr><td title='The health check result'>ok</td><td data-type='java.lang.Boolean'>true</td></tr> 
<tr><td title='The health check status'>status</td><td data-type='java.lang.String'>OK</td></tr> 
<tr><td title='The elapsed time in miliseconds'>elapsedTime</td><td data-type='java.lang.Long'>18</td></tr> 
<tr><td title='The date when the execution finished'>finishedAt</td><td data-type='java.util.Date'>2017-03-24T00:23:36+0530</td></tr> 
<tr><td title='Indicates of the execution timed out'>timedOut</td><td data-type='java.lang.Boolean'>false</td></tr> 

:私はこのsedコードを使用しようとした

values=(["hc.name"]="Replication Queue" ["status"]="OK") 

、それが唯一の複数動作<td></td>タグは別々の行にあります。この場合、複数の<td></td>が同じ行にあります。私は、彼らが非貪欲マッチングをサポートしているので、あなたが、このためにPerlの正規表現を使用して、より良い運を持っているだろうと思い

<tr> 
<td>ok</td> 
<td>status</td> 
</tr> 
+0

問題は何ですか? –

+0

シェルスクリプトの新機能ですが、sed/awkを使ったコマンドはほとんど試してみましたが、うまく機能していないため、上記の配列構造をどのように設定するかわかりません。 –

+0

使用しているシェルスクリプト/コマンドはありますか?問題を説明し、それを解決するためにこれまでに何が行われたのかを教えてください。 – Kadir

答えて

0

:これだけのように入力して結果を表示するコマンド

sed -n 's:.*<td>(.*)</td>.*:\1:p' sample.txt 

。ここにあなたのファイルから情報を印刷したPerlワンライナーは、次のとおりです。

perl -ne 'm:.*?<td [^>]*>(.*?)</td>.*?<td [^>]*>(.*?)</td>:; print "[\"$1\"] = \"$2\"\n";' sample.txt 

この出力は:ここでは

["hc.name"] = "Replication Queue" 
["service.pid"] = "com.adobe.granite.replication.hc.impl.ReplicationQueueHealthCheck" 
["ok"] = "true" 
["status"] = "OK" 
["elapsedTime"] = "18" 
["finishedAt"] = "2017-03-24T00:23:36+0530" 
["timedOut"] = "false" 

も作品sedの呼び出しですが、それがすべて一致したとして、これはあまり正確です><以外の文字は、貪欲でない一致と近似しています。これはsedではサポートされていません。

sed -n 's:.*<td [^>]*>\([^<]*\)</td><td [^>]*>\([^<]*\)</td>.*:[\"\1\"] = \"\2\":p' sample.txt 

この出力:

["hc.name"] = "Replication Queue" 
["service.pid"] = "com.adobe.granite.replication.hc.impl.ReplicationQueueHealthCheck" 
["ok"] = "true" 
["status"] = "OK" 
["elapsedTime"] = "18" 
["finishedAt"] = "2017-03-24T00:23:36+0530" 
["timedOut"] = "false" 
+1

ありがとう@David。それは正常に動作しています。 –

0

sgrepsed方法(純sedよりも信頼性が高い):

sgrep -o'%r"' '">" __ "<"' sample.txt | sed 's/^/["/;s/""/"/;s/"/"]="/2' 

出力:

["hc.name"]="Replication Queue" 
["service.pid"]="com.adobe.granite.replication.hc.impl.ReplicationQueueHealthCheck" 
["ok"]="true" 
["status"]="OK" 
["elapsedTime"]="18" 
["finishedAt"]="2017-03-24T00:23:36+0530" 
["timedOut"]="false" 
関連する問題