SED-非贪婪的正则表达式似乎无法在sed中工作

Mir*_*hdi 1 regex bash sed

当我从在线RegEx测试工具上运行正则表达式模式时,以下文本可以正常工作。但是,在UNIX上使用sed时,它不起作用

文本:

<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>
Run Code Online (Sandbox Code Playgroud)

正则表达式:

<DtTm>(.*?)<\/DtTm>
Run Code Online (Sandbox Code Playgroud)

Sed中的用法:希望删除<DtTm>和之间的任何内容</DtTm>

sed 's/<DtTm>(.*?)<\/DtTm>//g'
Run Code Online (Sandbox Code Playgroud)

预期产量:

<Field1><Field2><Field3>001</Field3></Field2><Field4><FieldDesc>Transaction Successful</FieldDesc></Field4><Field5><Field6>N</Field6><Field7></Field7></Field5></Field1>
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 5

GNU sed有两种模式,基本模式和扩展模式。这些都不是较不先进的sed实现的单一基本模式,也不允许非贪婪的规范。根据info sed输出:

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

因此,如果您需要不贪心,则必须选择其他工具,例如Perl(或其他支持PCRE的工具),这可能就是您提到的在线测试工具所使用的工具。

很好的是,Perl替代命令是如此惊人地类似于sed您可以经常更改程序名称的命令(并且在复杂的RE中可能使用不同的定界符,因此您不会像一样看到锯齿\/\/\/\/\/):

perl -pe 's|<DtTm>.*?</DtTm>||g'
Run Code Online (Sandbox Code Playgroud)