关于使用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
  • 我想要CSV 格式的所有三个字段 ( storeDelete、 )。Expires
  • 如果没有DeleteExpires行/字符串,则应显示为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:行已经在缓冲区中,并且可以格式化收集的字段以进行输出。

诀窍在于复杂的正则表达式。可选字段放在 里面()*,因此它们可以出现任意多次。如果它们根本不出现,整个正则表达式仍然匹配。

为了吃掉垃圾而不吃掉可选字段,我确实选择了[^>]*而不是.*使用以 开头的行>

第一行用于重新格式化日期。最后两行处理文件以store:行结尾的情况。

相关内容