我有以下文件格式
Received from +11231231234 at 2021-10-10T19:56:50-07:00:
This is a message that contains words like from, at, etc.
Sent to +11231231234 at 2021-10-11T06:50:57+00:00:
This is another message that contains words like to, at, etc.
我想清理“已接收”和“已发送”行,以下 sed 命令可以实现此目的
cat file | sed 's/from//g' | sed 's/to/ /g' | sed 's/+\w\+//' | sed 's/at//g' | \
sed 's/T/ /g' | sed 's/[[:digit:].]*\:$//' | sed 's/[[:digit:].]*\:$//' | sed 's/-$//' | \
sed 's/-$//' | sed 's/+$//'
并产生以下结果
Received 2021-10-10 19:56:50
This is a message that contains words like , , etc.
Sent 2021-10-11 06:50:57
This is another message that contains words like , , etc.
正如您所看到的,它确实很好地清理了“已接收”和“已发送”行。但它也会清理消息行!如何仅在以“Received”和“Sent”开头的行上应用这些操作?
答案1
这就是 sed 中地址的用途:
sed -E '/^(Received|Sent) (from|to) \+[0-9]+ at/ s/ .*([0-9]{4}-[0-9]{2}-[0-9]{2})T([0-9:]{8}).*/ \1 \2/'
- 地址意味着替换仅应用于以 or 开头
Received
或Sent
后跟from
或to
,+
后跟数字 和 的行at
。 - 替换从空格开始匹配,它捕获日期(
[0-9]{4}
是一个数字重复四次ETC。);它匹配T
并再次捕获时间。时间之后的内容被匹配,但未被捕获。然后,整个匹配部分被替换为几个空格以及捕获的日期和时间。