use*_*574 1 regex unix bash sed
给出一个文件:
2014-08-01 20:13:17.666 xxxxxxxxxx
2014-08-01 20:13:17.666 xxxxxxxxxx
2014-08-01 20:13:17.666 xxxxxxxxxx
......
Run Code Online (Sandbox Code Playgroud)
我试图使用sed删除微秒:
GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)
以下是失败,错误消息"sed:-e expression#1,char 38:无效范围结束"
sed 's/\([0-9][0-9\- :]*\)\.[0-9]\{3\}/\1/g' < a.csv
Run Code Online (Sandbox Code Playgroud)
但是,vi a.csv和搜索
\([0-9][0-9\- :]*\)\.[0-9]\{3\}
Run Code Online (Sandbox Code Playgroud)
工作良好.
rootcause是转义的连字符.如果我删除了转义的连字符,sed将不会抱怨但它与预期的模式不匹配.我尝试过不同的方法来逃避连字符无济于事.
解决方法是明确写出整个日期时间格式,如下所示:
sed 's/\([0-9][0-9]*-[0-9][0-9]-[0-9][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]\)\.[0-9]\{3\}/\1/g'
Run Code Online (Sandbox Code Playgroud)
解决方法看起来很丑陋而且很麻烦.我确实认识到底层RE引擎在sed和vi之间是不同的.但是,我喜欢
与sed错误"无效范围结束"相关但未解决
在字符类中,连字符必须是第一个或最后一个.试图用反斜杠转义它是行不通的(而是在类中添加反斜杠).
有多种sed方言和多种其他正则表达式实现的工作方式不同,但在这种情况下,诊断是相当简单的.并修复:
sed 's/\([0-9][-0-9 :]*\)\.[0-9]\{3\}/\1/' < a.csv
Run Code Online (Sandbox Code Playgroud)
(我也删除了这个/g标志,因为它在这里似乎是多余的.当然,这个模式的每一行不超过一次?)