仅对以特定字符串开头的行执行 sed 操作

仅对以特定字符串开头的行执行 sed 操作

我有以下文件格式

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 开头ReceivedSent后跟fromto+后跟数字 和 的行at
  • 替换从空格开始匹配,它捕获日期([0-9]{4}一个数字重复四次ETC。);它匹配T并再次捕获时间。时间之后的内容被匹配,但未被捕获。然后,整个匹配部分被替换为几个空格以及捕获的日期和时间。

相关内容