如何使用sed删除模式的最后几个字符

时间:2017-10-10 16:26:29

标签: bash unix sed pattern-matching

我已经完成了所有主题,但仍然无法找到答案。

例如。

我有格式的时间戳:yyyy-mm-dd hh:mm:ss.xxx

其中xxx表示毫秒。

我想摆脱xxx部分,注意这个时间戳不在某个位置,所以我们不能将它作为行尾或行开头的一部分。(在unix命令或bash脚本中)

我能想到的方法是使用sed,但我所能做的只是获取模式,但不知道如何处理模式,似乎所有模式都是为了定位线而不是模式本身。所以我们通常可以想到这样的问题:如何使用sed来删除某个模式的最后几个字母。

感谢阅读。

注意xxx可以是0-999,所以它可以是1,2,3位数,样本就像:

asfd,asasfsf,afas,2017-10-20 13:22:22.0,333,222,0.002
nyh,nyhny,nhy,2 23 4 23 32:23:14.czxv,2017-10-20 13:22:22.234,12.0,234.22
nyh,nyhny,nhy,2017-10-20 13:22:22.234,12.0
wn,rrwn,daff,2017-10-20 13:22:32.543,12,32

我的期望是:

asfd,asasfsf,afas,2017-10-20 13:22:22,333,222,0.002
nyh,nyhny,nhy,2 23 4 23 32:23:14.czxv,2017-10-20 13:22:22,12.0,234.22
nyh,nyhny,nhy,2017-10-20 13:22:22,12.0
wn,rrwn,daff,2017-10-20 13:22:32,12,32

2 个答案:

答案 0 :(得分:1)

根据OP显示的Input_file提出了新的以下解决方案。

awk '{sub(/\.[^,]*/,"",$2)} 1'  Input_file

说明: 此处还添加了awk代码说明。

awk '{
sub(/\.[^,]*/,"",$2) ##sub is awk in-built utility, which will substitute on basis of sub(text/regex which we need to replace,"new_text"/variable_value,For a current line/variable/field), so in this case I am using a REGEX which will look from a DOT to first occurrence of comma(,) which I am substituting with NULL in 2nd field(your 2nd field is the one which is having timing details because awk has space as delimiter by default). 
}
1                    ##awk works on method of condition then action. So Here I am making condition TRUE by mentioning 1 and no action is mentioned so be default print action will happen.
'  Input_file

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed 's/\(....-..-.. ..:..:..\)\..../\1/g' file

这非常懒惰,但最有可能在99%的时间内都有效。它匹配时间戳分隔符,然后在结尾处删除.xxx。如果你愿意,你可以更具体,即

sed 's/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\)\.[0-9]\{3\}/\1/g' file

使用-r选项删除牙签:

sed -r 's/([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2})\.[0-9]{3}/\1/g' file