Sed Regex^.*(插入符号点星号)不';不匹配

Sed Regex^.*(插入符号点星号)不';不匹配,regex,macos,sed,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=432407E73A6BFE1C4AFE8205ED3869

目前我有一个格式如下的文件:

####<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>

令人惊讶的是,在我的sed命令中,
^.*priceRuleDesc=
不匹配,无法用
foo
替换队列中的所有内容。我怀疑
^..*
只是走到了行的末尾,当
priceRuleDesc
发生时,它没有足够聪明地停下来。我发现了另一个类似于这个问题的问题,但我不相信这个问题中发生的事情就是这里发生的事情,我也想知道是否有一个Sed解决方案。另外,我确信这一定是我没有发现的其他问题的重复。所以,如果有人能给我指出正确的问题,或者提供一个答案,那就太好了。谢谢。

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

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

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

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
对我来说很好:

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 ~ $ 
mike~$cat foo.txt
####         
####         
####         
mike~$sed-E的/^.*priceRuleDesc=/foo/'foo.txt
食品数据:PRO-18.612782:NOBTA>
食品SDTA:PRO-15.806297:NOBTA>
食品SDTA:PRO-4.2497005:NOBTA>
迈克~$
我建议先检查sed的输入

对我来说很好:

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 ~ $ 
mike~$cat foo.txt
####         
####         
####         
mike~$sed-E的/^.*priceRuleDesc=/foo/'foo.txt
食品数据:PRO-18.612782:NOBTA>
食品SDTA:PRO-15.806297:NOBTA>
食品SDTA:PRO-4.2497005:NOBTA>
迈克~$
我建议先检查sed的输入,这可能适合您(GNU-sed):

这也可以替代grep命令。

这可能适合您(GNU-sed):


这也可以取代grep命令。

所以我终于明白了到底发生了什么。我想如果其他人遇到同样的问题,我会发布这个答案。本质上,这个问题与sed命令的regex中的
*
项没有任何关系。一切都和格雷普有关。问题是grep突出显示了匹配的
priceRuleDesc=
术语,而没有考虑到这一点。我的grep命令之所以突出显示术语,是因为嵌入在大型
~/.bash_profile
中,我放置了该命令(从其他人工作时的文件中复制并批量粘贴):

此选项的效果是,当grep现在匹配文本时,它实际上会通过插入标准输出中看不到的字符来转换文本。虽然更美观,但不幸的是,这使得输出对于使用正则表达式的其他命令没有用处,这些正则表达式将grep的输出通过管道传输到它们(即sed命令)。但是,您可以通过
xxd
命令查看这些chracter

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\u配置文件中的
GREP\u选项
行并重新启动终端,GREP命令最终没有添加与发布的正则表达式不匹配的额外字符。

,因此我终于明白了发生了什么。我想如果其他人遇到同样的问题,我会发布这个答案。本质上,这个问题与sed命令的regex中的
*
项没有任何关系。一切都和格雷普有关。问题是grep突出显示了匹配的
priceRuleDesc=
术语,而没有考虑到这一点。我的grep命令之所以突出显示术语,是因为嵌入在大型
~/.bash_profile
中,我放置了该命令(从其他人工作时的文件中复制并批量粘贴):

此选项的效果是,当grep现在匹配文本时,它实际上会通过插入标准输出中看不到的字符来转换文本。虽然更美观,但不幸的是,这使得输出对于使用正则表达式的其他命令没有用处,这些正则表达式将grep的输出通过管道传输到它们(即sed命令)。但是,您可以通过
xxd
命令查看这些chracter

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\u配置文件中的
GREP\u选项
行并重新启动终端,GREP命令最终没有添加与发布的正则表达式不匹配的额外字符。

Mike,你在使用Mac吗?是的,El Capitan内置sedMike,你在使用Mac吗?是的,El Capitan内置SED问题在于,我不想在
priceRuleDesc
术语之后替换任何内容,只替换它之前的内容。但是您写道:我试图去掉priceRuleDesc=术语之后和最后一个>字符之前的所有内容。您对显示的输入的预期输出是什么?完全令人困惑的语言。我的错。我的意思是我只想保留priceRuleDesc之后的数据。很抱歉造成混淆。所以您希望在第一行中的
SNSDTA:PRO-18.612782:NOBTA>
作为输出?谢谢anubhava,如果没有我没有考虑到的突出显示字符,您的答案肯定会起作用。有关详细信息,请参见下面的答案。感谢您的帮助-非常感谢,它在故障排除中确实很有用,可以找出发生了什么。但问题是,我不想在
priceRuleDesc
术语之后替换任何内容,只有它之前的内容。但是您写道:我试图去掉priceluledesc=术语之后和最后一个>字符之前的所有内容。您对显示的输入的预期输出是什么?完全令人困惑的语言。我的错。我爱我