テキスト処理:ファイルの一部を抽出して1行に書き込みます。

テキスト処理:ファイルの一部を抽出して1行に書き込みます。

次の形式のファイルが複数あります。

...
<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

関連情報