2010-05-31 152 views
0

多個文件SED或grep的或AWK匹配非常非常長的行

param1=" 1,deerfntjefnerjfntrjgntrjnvgrvgrtbvggfrjbntr*rfr4fv*frfftrjgtrignmtignmtyightygjn  2,3,4,5,6,7,8, 
rfcmckmfdkckemdio8u548384omxc,mor0ckofcmineucfhcbdjcnedjcnywedpeodl40fcrcmkedmrikmckffmcrffmrfrifmtrifmrifvysdfn drfr4fdr4fmedmifmitfmifrtfrfrfrfnurfnurnfrunfrufnrufnrufnrufnruf"**** 

需要的param1的內容相匹配爲

sed -n "/$param1/p" file 

但由於線路長度(很長的線)我不能匹配行 什麼是匹配非常長的行的最佳方式?

+0

難道你不是指'sed -n「/^param1/p」'? 「$」匹配行尾; 「^」開頭。 – 2010-05-31 11:55:30

+1

這條線的長度沒有限制。請更具體一點:問題究竟在哪裏? – 2010-05-31 11:55:48

+0

@Dav $是shell變量替換。 – bmargulies 2010-05-31 11:57:56

回答

1

您面臨的問題是param1包含sed正在解釋的特殊字符。星號('*')用於表示'零次或多次出現前一個字符',所以當這個字符被sed解釋時,沒有什麼東西可以匹配你正在尋找的字面星號。

以下是工作bash腳本,應該有所幫助:

#!/bin/bash 

param1=' 1,deerfntjefnerjfntrjgntrjnvgrvgrtbvggfrjbntr\*rfr4fv\*frfftrjgtrignmtignmtyightygjn 2,3,4,5,6,7,8, rfcmckmfdkckemdio8u548384omxc,mor0ckofcmineucfhcbdjcnedjcnywedpeodl40fcrcmkedmrikmckffmcrffmrfrifmtrifmrifvysdfn' 

cat <<EOF | sed "s/${param1}/Bubba/g" 
1,deerfntjefnerjfntrjgntrjnvgrvgrtbvggfrjbntr*rfr4fv*frfftrjgtrignmtignmtyightygjn 2,3,4,5,6,7,8, rfcmckmfdkckemdio8u548384omxc,mor0ckofcmineucfhcbdjcnedjcnywedpeodl40fcrcmkedmrikmckffmcrffmrfrifmtrifmrifvysdfn  
EOF 
+0

THX但我並不需要更換行只匹配,如grep 目標是驗證匹配 yael – yael 2010-05-31 14:20:40

+2

這只是一個例子來說明你遇到的問題,目的是讓你專注於問題(你的匹配表達式中有特殊字符),而不是我使用它的方式。很顯然你不會用'布巴'取代你的比賽。 – 2010-05-31 14:43:22

+0

@yael:你爲什麼不使用'grep'? – 2010-05-31 15:10:38

1

也許問題是,你的$param1包含特殊字符?這個工作對我來說:

A="$(perl -e 'print "a" x 10000')" 
echo $A | sed -n "/$A/p" 

$A包含10個000 a字符)。

echo $A | grep -F $A 

echo $A | grep -P $A 

也可以(第二需要的grep帶有內置PCRE支持。如果你想要的模式匹配,你應該使用這個或pcregrep。如果你不這樣做,使用固定grep(grep -F))。

echo $A | grep $A 

太慢了。

+0

我可以從perl獲得更多有用的解決方案嗎? – yael 2010-05-31 14:26:28

+0

您的意思是「有用」? – ZyX 2010-05-31 14:27:21