Sed字符串替换为文件

时间:2015-07-19 16:44:32

标签: regex bash sed

因为大文件而使用Sed,我想匹配表单的字符串

  

'09 / 07/15 16:56:36,333000000','DD / MM / RR HH24:MI:SSXFF'

并将其替换为

  

'09 / 07/15 16:56:36','DD / MM / RR HH24:MI:SS'

regex tester检查此正则表达式似乎与
匹配 '\d{2}\/\d{2}\/\d{2}\s\d{2}:\d{2}:\d{2},\d{9}','DD\/MM\/RR HH24:MI:SSXFF'

但是当我做的时候

sed -ie "s#\(\x27\d{2}\/\d{2}\/\d{2}\s\d{2}:\d{2}:\d{2}\),\d{9}  
\(\x27,\x27DD\/MM\/RR HH24:MI:SS\)XFF\x27#\1\2\x27#g" inputfile  

它不会取代任何东西。 我错过了什么?

2 个答案:

答案 0 :(得分:2)

为什么不使用这样的东西?

#!/usr/bin/sed -f
s/,[[:digit:]]*//
s/XFF//

答案 1 :(得分:0)

注意:在下面的答案中,我描述了为什么你的表达式一般不起作用。我强烈建议您尽可能先尝试简化表达,或使用@ StevenPenny的优秀答案,因为:

  • 在您目前的表达中应用下面描述的更改会将其变成一个笨重,无法维护的正则表达式噩梦;
  • 我的言论可能并非详尽无遗 - 他们指出了原因,一些特殊问题以及进一步调查的来源。

问题是sedhttp://regexr.com/正则表达式引擎有些不同。请参阅网站上的“RegEx引擎”部分:

  

虽然正则表达式的核心功能集相当一致,但不同的实现(例如Perl vs Java)可能具有不同的功能或行为。

     

RegExr使用浏览器的RegExp引擎进行匹配,其语法突出显示和文档反映了JavaScript RegExp标准。

而最新版本的GNU sed大多与POSIX.2基本正则表达式(BRE)兼容。有关GNU sed(1)的版本4.2.2,请参阅sed联机帮助页的摘录:

  

正常表达

     

应该支持POSIX.2 BRE,但它们并不完全是因为性能问题。正则表达式中的\ n序列与换行符匹配,对于\ a,\ t和其他序列也是如此。

POSIX正则表达式语言的描述(即BRE - 基本正则表达式和ERE - 扩展正则表达式)位于regex(7)联机帮助页。

特别是关于你的表达:

  • 字符类表示法不同:例如,对于您使用的数字\d,在BRE中您应该写[[:digit:]];对于空格,您使用的是\s,而在BRE中则是[[:space:]]
  • 为了逃避字面意义,有些字符必须以反斜杠为前缀。这涉及{,其中BRE应为\{