sed:删除包含正则表达式的行

sed:删除包含正则表达式的行

我的日志文件中有以下内容:

[2.09 10:23:56] 
[23.09 10:3:56] 
[23.09 10:23:56] Some other thing
[23.09 10:23:56] 
[23.09 10:23:56] 
[23.09 10:23:5] 
[23.09 10:23:56] Something
[23.09 10:23:56] 

并想使用 sed 删除“空”行(仅包含时间戳的行)。我尝试过以下方法:

sed -i '/\[\d{1,2}\.\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}\] ($|\R)/d' file
sed -i '/\[[0-9][0-9]?\.[0-9][0-9]? [0-9][0-9]?:[0-9][0-9]?:[0-9][0-9]?\] \n/d' file
sed -i '/\[[0-9][0-9]?\.[0-9][0-9]? [0-9][0-9]?:[0-9][0-9]?:[0-9][0-9]?\] ($|\R)/d' file

但似乎没有任何效果。

任何帮助表示赞赏!

答案1

据我所知,不需要创建与行开头括号内的日期字符串匹配的表达式。

$ grep -v -x '\[[^]]*\][[:blank:]]*' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something

上面删除了以括号字符串 ( [like this]) 开头且仅包含可选尾随空格的行。

有了sed,这看起来像

$ sed '/^\[[^]]*\][[:blank:]]*$/ d' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something

表达式的起始位\[[^]]*\]是一个文字,[后跟零个或多个非]字符,最后是文字]

使用awk,我们可以将字段分隔符设置为][[:blank:]]*,这意味着]时间戳末尾的 (以及后面的任何空格)将是两个字段之间的分隔符。如果第二个字段为空,我们不会打印当前行。

$ awk -F '][[:blank:]]*' '$2 != ""' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something

作为卡西莫多在评论中指出(现已删除),使用awk 'NF > 2' file也适用于问题中提供的示例数据。此方法依赖于awk默认情况下将行拆分为空白字段的事实。此变体不关心每行的细节,并删除除具有两个以上空格分隔字段的行之外的所有行。

答案2

sed '/^\[[0-9]\{1,2\}\.[0-9]\{1,2\} [0-9]\{1,2\}:[0-9]\{1,2\}:[0-9]\{1,2\}\] $/ d'
  • sed 不支持\d.
  • 量词{...}必须用反斜杠(除非您使用-E
  • 替代方案|必须是反斜杠(除非您使用-E
  • 可选符号?必须是反斜杠(除非您使用-E

相关内容