You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SED删除日志中[dd-mmm-yyyy hh:mm:ss]格式的重复日期

用Sed删除日志中特定格式的前置日期

需求场景

处理日志流时,部分日志记录包含两种格式的日期:

  • 需删除的格式:[dd-mmm-yyyy hh:mm:ss](例如[27-Jan-2023 17:21:42])
  • 需保留的格式:[yyyy-mm-dd hh:mm:ss](例如[2023-01-27 17:21:42])

目标是删除每条日志中前置的dd-mmm-yyyy格式日期,仅保留yyyy-mm-dd格式的日期及后续内容;对于只有yyyy-mm-dd格式日期的日志行,保持原样。

正确的Sed命令

方式一:使用扩展正则表达式(推荐)

GNU Sed使用-r参数,BSD/macOS Sed使用-E参数,启用扩展正则表达式后无需转义量词{}:

# GNU Sed
sed -r 's/\[[0-9]{2}-[A-Za-z]{3}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}\] //' logfile.txt

# macOS/BSD Sed
sed -E 's/\[[0-9]{2}-[A-Za-z]{3}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}\] //' logfile.txt

方式二:使用基础正则表达式

如果无法使用扩展正则,需转义{}:

sed 's/\[[0-9]\{2\}-[A-Za-z]\{3\}-[0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\] //' logfile.txt

直接修改原文件

若要直接修改日志文件而非输出到终端,添加-i参数(注意不同系统的差异):

# GNU Sed
sed -i -r 's/\[[0-9]{2}-[A-Za-z]{3}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}\] //' logfile.txt

# macOS/BSD Sed
sed -i '' -E 's/\[[0-9]{2}-[A-Za-z]{3}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}\] //' logfile.txt

命令说明

  • 正则表达式\[[0-9]{2}-[A-Za-z]{3}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}\] 精准匹配需删除的日期格式(注意末尾的空格),替换为空字符串即可移除该部分。
  • 对于仅包含目标日期的日志行,由于不匹配上述正则,不会被修改,直接保留原内容。

之前尝试失败的原因

  1. 第一个命令未启用扩展正则:Sed默认使用基础正则表达式,{}作为量词时必须转义,否则会被当作普通字符处理,导致匹配失败。
  2. 第二个命令正则逻辑错误:\[[^][]*\] $会尝试匹配行尾的[]内容,但前置日期后并非行尾(而是空格+目标日期),且未定义捕获组就使用\1,逻辑完全不匹配需求。

内容的提问来源于stack exchange,提问作者manuerumx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:31:00