当我从在线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)
GNU sed有两种模式,基本模式和扩展模式。这些都不是较不先进的sed实现的单一基本模式,也不允许非贪婪的规范。根据info sed输出:
注意,正则表达式匹配器是贪婪的,也就是说,尝试从左到右进行匹配,如果可能从同一字符开始两个或多个匹配,它将选择最长的匹配器。
因此,如果您需要不贪心,则必须选择其他工具,例如Perl(或其他支持PCRE的工具),这可能就是您提到的在线测试工具所使用的工具。
很好的是,Perl替代命令是如此惊人地类似于sed您可以经常更改程序名称的命令(并且在复杂的RE中可能使用不同的定界符,因此您不会像一样看到锯齿\/\/\/\/\/):
perl -pe 's|<DtTm>.*?</DtTm>||g'
Run Code Online (Sandbox Code Playgroud)