2015-10-23 191 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命令。