SED - 非贪婪的正则表达似乎不适用于sed

时间:2016-07-15 01:23:25

标签: regex bash sed

当我从在线RegEx测试工具运行正则表达式模式时,下面的文字工作正常。但是,在seix上使用unix

时它无法正常工作

文本:

<Field1><Field2><Field3>001</Field3></Field2><Field4><FieldDesc>Transaction Successful</FieldDesc></Field4><DtTm><LocalDtTm>2016-07-01-12:05:40.383</LocalDtTm></DtTm><Field5><Field6>N</Field6><Field7></Field7><DtTm><LocalDtTm>2016-07-01-12:05:44.171</LocalDtTm></DtTm></Field5></Field1>

正则表达式:

<DtTm>(.*?)<\/DtTm>

Sed中的用法:希望删除<DtTm></DtTm>

之间的任何内容
sed 's/<DtTm>(.*?)<\/DtTm>//g'

预期产出:

<Field1><Field2><Field3>001</Field3></Field2><Field4><FieldDesc>Transaction Successful</FieldDesc></Field4><Field5><Field6>N</Field6><Field7></Field7></Field5></Field1>

1 个答案:

答案 0 :(得分:5)

GNU sed有两种模式,基本模式和扩展模式。这些以及不太先进的sed实现的单一基本模式都不允许非贪婪的规范。根据{{​​1}}输出:

  

请注意,正则表达式匹配器是贪婪的,即从左到右尝试匹配,如果从同一个字符开始可能有两个或多个匹配,则选择最长的匹配。

所以,如果你需要非贪婪,你将不得不选择其他工具,例如Perl(或支持PCRE的其他东西),这可能是 您提到的在线测试工具正在使用。

好处是,Perl替换命令与info sed命令极为相似,您通常可以更改程序名称(并且可能在复杂的RE中使用不同的分隔符,因此您不会这样做。最终得到像sed)这样的锯齿:

\/\/\/\/\/