当我从在线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>
答案 0 :(得分:5)
GNU sed
有两种模式,基本模式和扩展模式。这些以及不太先进的sed
实现的单一基本模式都不允许非贪婪的规范。根据{{1}}输出:
请注意,正则表达式匹配器是贪婪的,即从左到右尝试匹配,如果从同一个字符开始可能有两个或多个匹配,则选择最长的匹配。
所以,如果你需要非贪婪,你将不得不选择其他工具,例如Perl(或支持PCRE的其他东西),这可能是 您提到的在线测试工具正在使用。
好处是,Perl替换命令与info sed
命令极为相似,您通常可以更改程序名称(并且可能在复杂的RE中使用不同的分隔符,因此您不会这样做。最终得到像sed
)这样的锯齿:
\/\/\/\/\/