【发布时间】:2014-09-30 00:06:04
【问题描述】:
给定一个文件:
2014-08-01 20:13:17.666 xxxxxxxxxx
2014-08-01 20:13:17.666 xxxxxxxxxx
2014-08-01 20:13:17.666 xxxxxxxxxx
......
我正在尝试使用 sed 删除微秒:
GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.
以下失败并显示错误消息“sed: -e expression #1, char 38: Invalid range end”
sed 's/\([0-9][0-9\- :]*\)\.[0-9]\{3\}/\1/g' < a.csv
然而,vi a.csv 并搜索
\([0-9][0-9\- :]*\)\.[0-9]\{3\}
工作正常。
根本原因是转义的连字符。如果我删除转义的连字符,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'
解决方法看起来既丑陋又麻烦。我确实意识到 sed 和 vi 之间的底层 RE 引擎是不同的。不过,我喜欢
- 了解为什么在 sed 中转义连字符也会失败
- 如何修改 sed 的 RE 以使其更优雅。
与sed error "Invalid range end" 相关但未由sed error "Invalid range end"解决
【问题讨论】:
-
您可以将
[0-9]缩短为\d,如果您有[0-9][0-9],您可以使用\d{2} -
谢谢费德。我刚开始使用 RE 并欣赏上述改进。