一致するパターンの後に次の行を取得し、その行の2つのパターン間の値を切り捨てるか切り捨てる必要があります。
サンプルソースファイル
<h2>Commodity Information</h2>
<dl>
<dt>Commodity Orgin</dt>
<dd>uerb45e001.material.com</dd>
<dt>Commodity Code & Dimension</dt>
<dd>151151.15 Dim 90 </dd>
<dt>Commodity Serial #</dt>
<dd>2009081020</dd>
<dt>Client Name</dt>
<dd>Jack</dd>
</dl>
希望の出力:
Commodity Orgin : uerb45e001.material.com
Commodity Code & Dimension : 151151.15 Dim 90
Commodity Serial # : 2009081020
Client Name : Jack
答え1
lynx -dump
HTMLをプレーンテキストに変換し、フィールド区切りawk
文字を改行文字(\n
)に設定し、レコード区切り文字を複数の改行文字(\n\n+
)に設定して出力形式を再指定します。
sub()
スクリプトの関数呼び出しは、awk
目的の出力を印刷する前に不要なスペースを削除します。
$ lynx -dump ramp.html |
awk -v RS='\n\n' -F'\n' '/^[[:space:]]+/ {
sub(/^ +/,"",$1);
sub(/ +/," ",$2);
print $1":"$2
}'
Commodity Orgin: uerb45e001.material.com
Commodity Code & Dimension: 151151.15 Dim 90
Commodity Serial #: 2009081020
Client Name: Jack
XMLやHTMLを解析することは決して良いアイデアではないので、私はこれが本当に好きではありません。正規表現の使用。それ動作しません。動作しているように見えるようにハッキングできるとしても、非常に脆弱です。〜するHTMLやXMLが正規表現が探しているものから十分に変更されると中断されます。実際のXMLまたはHTMLパーサーは次のとおりです。ただタスクを正しく実行すること。
ただし、以下はUNIXシリーズシステムで利用可能なsed
いくつかのツールです。fmt
$ sed -e '/<d[td]\|^[[:blank:]]*$/!d
s/<[^>]*>//g;
s/^ *//;
/^\(Commodity\|Client\)/ s/$/:/' ramp.html |
fmt |
sed -e '/^[[:blank:]]*$/d'
Commodity Orgin: uerb45e001.material.com
Commodity Code & Dimension: 151151.15 Dim 90
Commodity Serial #: 2009081020
Client Name: Jack
最初のsed
スクリプトはすべての行を削除します。とは別に<DT>
または、タグを含む空白行と行が<DD>
ある場合は、入力からすべてのHTMLタグが削除され、先行スペースが削除され、:
フィールド名行の末尾にが追加されます。次に、出力をsed
パイプで接続してfmt
行形式を再指定し、sed
空白行を削除します。
これはハッキングであり、あなたが提供したサンプル入力を正確に処理することだけが保証されます。大きな違いがあると、スクリプトが破損する可能性があります。これは、正規表現を使用して最も単純なHTMLまたはXMLを除くすべての項目を解析するときに発生する現象です。
答え2
があり、xmlstarlet
入力が有効なXML(マージ)の場合は、次のようにできます。
xmlstarlet sel --text -t -m //dt -v 'concat(., " : ", following::dd)' -nl input.html
答え3
paste -d: <(grep -oP '<dt>\K.*(?=<)' file.html) <(grep -oP '<dd>\K.*(?=<)' file.html) | sed 's/:/ : /'
Commodity Orgin : uerb45e001.material.com
Commodity Code & Dimension : 151151.15 Dim 90
Commodity Serial # : 2009081020
Client Name : Jack
- とタグの間のテキストを
grep
抽出する2つのコマンド(OPのサンプルファイルで提供されているものと同じ行にあると仮定)<dt>
<dd>
paste
2つのファイルを1行ずつ組み合わせて:
区切り記号として使用するsed
このコマンドは、OPの期待される出力に従って「:」区切り文字を「:」に置き換えます(タグ間のテキストに:文字も含まれている場合、このハッキングは機能しません)。- これを見て回答使用の説明
\K
と(?=)