Sed Regex ^。*(插入符号星号)不正确匹配

时间:2015-10-23 18:17:46

标签: regex macos sed

目前我的文件格式如下:

####<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解决方案。此外,我确信这必须与其他一些问题重复,我只是没有找到。所以,如果有人能够指出我认为很好的正确问题,或者提供一个很好的答案。感谢。

4 个答案:

答案 0 :(得分:2)

你可以使用基于否定的正则表达式:

sed 's/^.*priceRuleDesc=\|>$//g' file
SNSDTA:PRO-18.612782:NOBTA
SNSDTA:PRO-15.806297:NOBTA
SNSDTA:PRO-4.2497005:NOBTA

或使用awk

awk -F 'priceRuleDesc=|>$' '{print $2}' file
SNSDTA:PRO-18.612782:NOBTA
SNSDTA:PRO-15.806297:NOBTA
SNSDTA:PRO-4.2497005:NOBTA

答案 1 :(得分:1)

对我来说很好:

mike ~ $ cat foo.txt
####<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>
mike ~ $ sed -E 's/^.*priceRuleDesc=/foo/' foo.txt 
fooSNSDTA:PRO-18.612782:NOBTA>
fooSNSDTA:PRO-15.806297:NOBTA>
fooSNSDTA:PRO-4.2497005:NOBTA>
mike ~ $ 

我建议先检查sed的输入

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -E '/.*priceRuleDesc=(.*)>$/s//\1/p;d' file

这也可以替换grep命令。

答案 3 :(得分:1)

所以我终于弄清楚发生了什么。我想我会发布这个答案以防其他人遇到同样的问题。从本质上讲,该问题与sed命令的正则表达式中的.*项无关。一切都与grep有关。问题是grep强调了匹配的priceRuleDesc=术语,并没有考虑到这一点。我的grep命令突出显示了术语,因为嵌入了大~/.bash_profile我放置了命令(从工作中的其他人的文件中批量复制和粘贴):

export GREP_OPTIONS='--color=auto'

此选项的效果是,当grep现在与文本匹配时,它实际上通过插入您无法在该标准输出中看到的字符来对其进行转换。虽然在美学上更令人愉悦,但遗憾的是,这使得输出对于使用具有grep输出管道输出的正则表达式的其他命令(即sed命令)无效。但是,您可以通过xxd命令查看这些字符。

0015960: 3f29 3a1b 5b30 313b 3331 6d1b 5b4b 7072  ?):.[01;31m.[Kpr
0015970: 6963 6552 756c 6544 6573 631b 5b6d 1b5b  iceRuleDesc.[m.[
0015980: 4b3d 3e0a                                K=>.

您可以在此处看到最后c个字符和最后一个=字符之间有六个字符的问题,这些字符负责创建突出显示效果。通过在GREP_OPTIONS中注释掉~/.bash_profile行并重新启动终端,grep命令最终没有添加与发布的正则表达式不匹配的无关字符。