2015-10-23 146 views
1

目前,我有格式的文件,如下所示:桑达正则表达式^ *(尖点星号)不匹配正确

####<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解决方案。另外,我敢肯定,这肯定是我在这里找不到的其他问题的重复。因此,如果有人能指出我认为很好的正确问题,或者提供一个很好的答案。谢谢。

+0

在这里你不需要'grep',你的'sed'只会修改已经匹配的行。 (如果你确实需要过滤,你可以直接在'sed'中完成。'sed -E'/ priceRuleDesc/s /..../.../ –

+0

正确,但我需要grep来过滤掉行没有priceRuleDesc对象,我忽略了将它添加到示例文件中。 – entpnerd

+0

没有。只需使用'sed -nE'/ priceRuleDesc =/{s /..../..../; p}' '格式化,但是你的'sed'需要支撑块。 –

回答

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字符和最后一个字符=之间的六个大字,这是负责创建高亮效果。通过注释掉我的~/.bash_profile中的GREP_OPTIONS行并重新启动终端,grep命令最终没有添加与发布的正则表达式不匹配的多余字符。

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 
+0

这个问题虽然是我不想在'priceRuleDesc'这个术语后面取代任何东西,但只有在它之前。 – entpnerd

+0

但是你写道:** I '试图在priceRuleDesc = term和last> character之前删除所有内容**所示输入的期望输出是什么 – anubhava

+0

完全混淆的语言我的不好意思我的意思是我只想保留数据在priceRuleDesc之后。对不起,我很困惑。 – entpnerd

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

+0

迈克,你用的是Mac吗? – entpnerd

+0

是的,El Capitan内置sed – miken32

1

这可能为你工作(GNU SED):

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

这可太替代grep命令。