我的日志文件中有以下内容:
[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]
Run Code Online (Sandbox Code Playgroud)
并想使用 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
Run Code Online (Sandbox Code Playgroud)
但似乎没有任何效果。
任何帮助表示赞赏!
Kus*_*nda 10
据我所知,无需创建与行开头括号内的日期字符串匹配的表达式。
\n$ grep -v -x \'\\[[^]]*\\][[:blank:]]*\' file\n[23.09 10:23:56] Some other thing\n[23.09 10:23:56] Something\nRun Code Online (Sandbox Code Playgroud)\n上面删除了以括号字符串 ( ) 开头[like this]且仅包含可选尾随空格的行。
有了sed,这看起来像
$ sed \'/^\\[[^]]*\\][[:blank:]]*$/ d\' file\n[23.09 10:23:56] Some other thing\n[23.09 10:23:56] Something\nRun Code Online (Sandbox Code Playgroud)\n表达式的起始位\\[[^]]*\\]是一个文字,[后跟零个或多个非]字符,最后是文字]。
使用awk,我们可以将字段分隔符设置为][[:blank:]]*,这意味着]时间戳末尾的 (以及后面的任何空格)将是两个字段之间的分隔符。如果第二个字段为空,我们不会打印当前行。
$ awk -F \'][[:blank:]]*\' \'$2 != ""\' file\n[23.09 10:23:56] Some other thing\n[23.09 10:23:56] Something\nRun Code Online (Sandbox Code Playgroud)\n正如Quas\xc3\xadmodo在评论中指出的那样(现已删除),使用awk \'NF > 2\' file也适用于问题中提供的示例数据。awk此方法依赖于默认情况下将行拆分为空白字段的事实。此变体不关心每行的细节,并删除除具有两个以上空格分隔字段的行之外的所有行。
sed '/^\[[0-9]\{1,2\}\.[0-9]\{1,2\} [0-9]\{1,2\}:[0-9]\{1,2\}:[0-9]\{1,2\}\] $/ d'
Run Code Online (Sandbox Code Playgroud)
\d.{...}必须用反斜杠(除非您使用-E)|必须是反斜杠(除非您使用-E)?必须是反斜杠(除非您使用-E)