2017-10-10 51 views
1

我已经通过了所有的线程,但仍然找不到答案。如何使用sed删除模式的最后几个字符

例如。

我有格式的时间戳: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 
+0

欢迎来到堆栈溢出,是的,我们可以做到这一点,但你必须向我们展示示例输入和代码标签中的预期输出,请让我知道你是否有任何疑问。 – RavinderSingh13

回答

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 
1

按照任择议定书的显示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 
+0

非常感谢,而在xxx部分之前,这是一个,而不是:和xxx可以是1-3位,所以xxx可以是0或999或它们之间的任何数字 – BeyondTryingToCode

+0

对不起,错误的分类。在xxx之前应该是。而不是, 但是不要担心,我已经得到了你的代码,并将其中的部分更改为\。 ,而现在又出现了另一个问题,那就是它将删除任何后跟.xxx的内容,包括那些不包含时间戳记模式的数据。 – BeyondTryingToCode

+0

@BeyondZhang,我认为你显示的输出有错字,你能检查我编辑的awk代码,并让我知道这是否对你有帮助? – RavinderSingh13