sedの使用とデータフィルタリングに関する質問

sedの使用とデータフィルタリングに関する質問

以下はサンプルテキストファイルです。

store: xxx
Delete: xxx
Expires: Sat, 30 Oct 02021 13:01:57 +0100
store: xxx
Delete: xxx
Expires: Sat, 30 Oct 02021 13:01:57 +0100
store: abc
store: sdf
Expires: Sat, 30 Oct 02021 13:01:57 +0100
  • store3つのフィールド(、、、)はすべてCSV形式で必要ですDeleteExpires
  • Deleteまたは、行/文字列が存在しない場合は、カンマで区切られたスペースExpiresで表示する必要があります。null
  • 切り取る日付フィールドは次のとおりですDD Mon YYYY30 Oct 2001

これまでの助けを借りて以下を得ましたが、期待どおりに動作しません。

どんな助けでも大変感謝します。

cat list.txt | grep -E "Expires|Delete|Store" | awk '{ printf "%s\n", $2 }' | tr  '\n' ',' | sed 's/,,/\n/' | sed '$ s/.$//'

ベストアンサー1

何をしたいのか(なぜX-Delete-At、なぜObject:、不足しているフィールドを処理するのですか?)理解できないので、sed唯一の解決策を提案します。

sed -nE '/Expires:/{s/: [^,]*,/:/;s/0([0-9]{4})/\1_/}
  /store/!{H;$!d;}
  x;s/.*store: ([[:alnum:]]*)[^>]*[> ]*(Delete: ([[:alnum:]]*)[^>]*[> ]*)*(Expires: ([^_]*))*.*/\1,\3,\5/p
  $!d
  x;s/.*store: ([[:alnum:]]*).*/\1,,/p' /tmp/list.txt

アイデアは、次の行store:まで予約済みスペースにフィールドを収集し、バッファを変更して、次の行がすでにバッファにあり、収集されxstore:フィールドを出力用にフォーマットできるようにすることです。

秘訣は複雑な正規表現にあります。オプションのフィールドは内部に配置され、()*複数回表示できます。まったく表示されない場合、正規表現全体はまだ一致します。

ゴミを食べたり、オプションのフィールドを食べたりしないように、で始まる行を使用する[^>]*代わりに選択しました。.*>

最初の行は日付形式を再指定するために使用されます。最後の2行は、store:ファイルが1行で終わる場合を処理します。

おすすめ記事