次の形式のファイルが複数あります。
...
<title> Field1 : DATA_FIELD_1</title>
...
<i class="blablabla"></i> <b>Field2 : </b> <span>DATA_FIELD_2</span>
...
<i class="blablabla"></i> <b>Field3 : </b> <span>DATA_FIELD_3</span>
...
<i class="blablabla"></i> <b>Field4 : </b> <span>DATA_FIELD_4</span >
...
<i class="blablabla"></i> <b>Field5 : </b> <span>DATA_FIELD_5 </span>
...
各ファイルを読み取り、各フィールドのデータをインポートしてから、パイプで区切られた形式で新しいファイルに書きたいと思います。
たとえば、
FileID | Field1 | Field2 | Field3 | Field4 | Field5
1 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5
2 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5
3 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5
4 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5
次のコマンドを使用して、grepでデータを抽出しました。
grep -o 'Field1 : .*\|Field2 : .*\|Field3 : .*\|Field4 : .*\|Field5 : .*' File-* >> NewFile
しかし、これは私が得た結果です
File-1:Field1 : DATA_FIELD_1</title>
File-1:Field2 : </b> <span>DATA_FIELD_2</span>
File-1:Field3 : </b> <span>DATA_FIELD_3</span>
File-1:Field4 : </b> <span>DATA_FIELD_4</span >
File-1:Field5 : </b> <span>DATA_FIELD_5 </span>
File-2:Field1 : DATA_FIELD_1</title>
File-2:Field2 : </b> <span>DATA_FIELD_2</span>
File-2:Field3 : </b> <span>DATA_FIELD_3</span>
File-2:Field4 : </b> <span>DATA_FIELD_4</span >
File-2:Field5 : </b> <span>DATA_FIELD_5 </span>
File-3:Field1 : DATA_FIELD_1</title>
File-3:Field2 : </b> <span>DATA_FIELD_2</span>
File-3:Field3 : </b> <span>DATA_FIELD_3</span>
File-3:Field4 : </b> <span>DATA_FIELD_4</span >
File-3:Field5 : </b> <span>DATA_FIELD_5 </span>
答え1
別の可能なアプローチは、XMLプロセッサを使用することです。この場合、XMLstarlet。
xmlstarlet sel -t -v 'substring-after(//title,":")' \
-m //span -o "|" -v . \
-t -n *.xml
どこ:
sel -t
- 次のテンプレートに基づいてXML部分を選択します。-v 'substring-after(//title,":")'
- ":"の後のタイトル値。-m //span -o "|" -v .
-span
"|"とその値を一致させて印刷します。-t -n
- 改行文字を追加
答え2
通常、正規表現を使用してHTML / XMLを処理することは、すべての特殊なケースを処理するのに十分な表現力がないため、良い考えではありません。しかし、あなたのgrep出力はあなたの特定のケースでそうすることができることを示唆しています。
sedを使用してgrepコマンドの出力を処理する方法は次のとおりです。
sed -e 'N;N;N;N;s/^File-\(.*\):Field1 : \(.*\)<\/title>.*Field2 : .*<span>\(.*\)<\/span *>.*Field3 : .*<span>\(.*\)<\/span *>.*Field4 : .*<span>\(.*\)<\/span *>.*Field5 : .*<span>\(.*\)\s*<\/span *>/\1 | \2 | \3 | \4 | \5 | \6/'
説明する:
N;N;N;N;
:これは5行を5行に連結するために使用されます(ファイル内のすべてのフィールドを同じ行に配置するため)。s/
:交換コマンドが開始されます。最初の部分は一致し、2番目の部分は交換されます。^File-\(.*\):
:ファイル番号と一致します。Field1 : \(.*\)<\/title>
:最初のフィールドと一致します。.*Field2 : .*<span>\(.*\)<\/span *>
:2番目と一致します。- ...
/\1 | \2 | \3 / \4 | \5 | \6/
:代替部分です。\(.*\)
最初の部分で区切られた各グループは、特殊変数などでキャプチャされ、再利用可能です\1
。\2
結果:
1 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5
2 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5
3 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5