以下はサンプルテキストファイルです。
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
store
3つのフィールド(、、、)はすべてCSV形式で必要ですDelete
。Expires
Delete
または、行/文字列が存在しない場合は、カンマで区切られたスペースExpires
で表示する必要があります。null
- 切り取る日付フィールドは次のとおりです
DD Mon YYYY
。30 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:
まで予約済みスペースにフィールドを収集し、バッファを変更して、次の行がすでにバッファにあり、収集されx
たstore:
フィールドを出力用にフォーマットできるようにすることです。
秘訣は複雑な正規表現にあります。オプションのフィールドは内部に配置され、()*
複数回表示できます。まったく表示されない場合、正規表現全体はまだ一致します。
ゴミを食べたり、オプションのフィールドを食べたりしないように、で始まる行を使用する[^>]*
代わりに選択しました。.*
>
最初の行は日付形式を再指定するために使用されます。最後の2行は、store:
ファイルが1行で終わる場合を処理します。