awk コマンドは、一致するパターンから次の行を取得し、2 つのパターン間の文字列を切り捨てます。

awk コマンドは、一致するパターンから次の行を取得し、2 つのパターン間の文字列を切り捨てます。

一致するパターンの後に次の行を取得し、その行の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 -dumpHTMLをプレーンテキストに変換し、フィールド区切り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>
  • paste2つのファイルを1行ずつ組み合わせて:区切り記号として使用する
  • sedこのコマンドは、OPの期待される出力に従って「:」区切り文字を「:」に置き換えます(タグ間のテキストに:文字も含まれている場合、このハッキングは機能しません)。
  • これを見て回答使用の説明\K(?=)

関連情報