【发布时间】:2016-01-23 09:09:56
【问题描述】:
目前我有一个格式如下的文件:
####<Oct 23, 2015 10:23:34 AM PDT> <ERROR> <com.foo.biz.jrules.ilog.RulesEngine> <BELC02NF206G3QN> <tcbiz2_1> <siteType=DOMESTIC> <catalina-exec-16> <sessionId=432407E73A6BFE1C4AFE8205ED386907> <clientIp=127.0.0.1> <com.foo.biz.jrules.ilog.RulesEngine.mapPricedSearch(?:?):priceRuleDesc=SNSDTA:PRO-18.612782:NOBTA>
####<Oct 23, 2015 10:23:34 AM PDT> <ERROR> <com.foo.biz.jrules.ilog.RulesEngine> <BELC02NF206G3QN> <tcbiz2_1> <siteType=DOMESTIC> <catalina-exec-16> <sessionId=432407E73A6BFE1C4AFE8205ED386907> <clientIp=127.0.0.1> <com.foo.biz.jrules.ilog.RulesEngine.mapPricedSearch(?:?):priceRuleDesc=SNSDTA:PRO-15.806297:NOBTA>
####<Oct 23, 2015 10:23:34 AM PDT> <ERROR> <com.foo.biz.jrules.ilog.RulesEngine> <BELC02NF206G3QN> <tcbiz2_1> <siteType=DOMESTIC> <catalina-exec-16> <sessionId=432407E73A6BFE1C4AFE8205ED386907> <clientIp=127.0.0.1> <com.foo.biz.jrules.ilog.RulesEngine.mapPricedSearch(?:?):priceRuleDesc=SNSDTA:PRO-4.2497005:NOBTA>
我正在尝试删除 priceRuleDesc= 术语之后和最后一个 > 字符之前的所有内容。目前,我正在尝试在我的 Mac 上测试 sed 中的正则表达式来完成此操作,但运气不佳。
我使用的命令是:
cat ~/myapp/logs/tcbiz2_1.log | grep -i priceRuleDesc | sed -E 's/^.*priceRuleDesc=/foo/'
令人惊讶的是,在我的 sed 命令中,^.*priceRuleDesc= 并不能匹配到用 foo 替换之前的所有内容。我怀疑^.* 只是走到队伍的尽头,而没有足够聪明地在priceRuleDesc 发生时停下来。我发现了另一个与 Non greedy regex matching in Sed 有点相似的问题,但我不相信这个问题中发生的事情就是这里发生的事情,我也想知道是否有 Sed 解决方案。另外,我确信这一定是我没有找到的其他问题的重复。因此,如果有人能指出我正确的问题,那将是很好的,或者提供一个很好的答案。谢谢。
【问题讨论】:
-
你不需要
grep在这里你的sed只会修改已经匹配的行。 (如果您确实需要过滤,您也可以直接在sed中执行此操作。sed -E '/priceRuleDesc/s/..../.../' -
正确,但我需要 grep 来过滤掉没有 priceRuleDesc 的行。我忽略了将其添加到示例文件中。
-
不。只需使用格式化的
sed -nE '/priceRuleDesc=/{ s/..../..../;p }',但是您的sed需要那个大括号。