Sed寫法
1)Sed由于處理方式是多個(gè)命令同時(shí)對(duì)一行進(jìn)行處理,所以在很多時(shí)候需要用while將整個(gè)要處理的文件包起來(lái),一行一行的來(lái)進(jìn)行處理,采用的結(jié)構(gòu)如下
while($line_current <$line_all)
@ line_current? =?$line_current? +? 1(注意符號(hào)之間是有空格的,這個(gè)特別需要注意,否則就會(huì)出現(xiàn)不必要的錯(cuò)誤,@后邊也是存在空格的)
end
提取line_all的方法:set line_all = `wc –l < $filename`這種方式
2)另外,很多時(shí)候會(huì)用if else等來(lái)將程序條件等包起來(lái),而且定義相應(yīng)的條件時(shí)可以設(shè)定相應(yīng)的flag,只有在滿足相應(yīng)的條件的flag滿足要求時(shí),才進(jìn)行相應(yīng)的變化,這可以很大程度上減少代碼數(shù)量;if的用法如下:
if(condition)then
Coding context
endif
如上所述,相應(yīng)的要注意if后邊要跟著相應(yīng)的then,最后要有endif。
3)另外還有一些方法可以用來(lái)匹配相應(yīng)的行中的內(nèi)容的方式:
set?a? `sed? –n “$line_current”’s/condition1/context/p‘ $filename`這種方式可以匹配相應(yīng)的context并將內(nèi)容給變量a
4)另外還有一些相應(yīng)的多條指令運(yùn)行和多種條件進(jìn)行匹配的方式;一種是sed –n –e ’s/aaa/bbb/’ –e ‘s/vvv/ddd/’ $filename這種方式同時(shí)對(duì)內(nèi)容進(jìn)行多次匹配替換,或者是采用相應(yīng)的\|這種邏輯或的方式來(lái)進(jìn)行。
5)當(dāng)然最常用的方法是采用.\{number\}的方式來(lái)進(jìn)行相應(yīng)的匹配,因?yàn)檫@個(gè)可以指定字符數(shù)目,而相應(yīng)的.可以替代一個(gè)字符。
6)可以采用相應(yīng)的bc來(lái)進(jìn)行計(jì)算并制定相應(yīng)的計(jì)算出來(lái)的數(shù)目的精確度,如下所示
set a = `echo “( $var1 - $var2 )” |bc? -l`的方式給變量a相應(yīng)的值,并制定精確度。
相應(yīng)的設(shè)定相應(yīng)的變量的時(shí)候注意相應(yīng)的“” ’’ ``等的不同的用法;
set avr = `echo $avr | awk ‘{printf “%.3f”,$0}’`這種方式來(lái)進(jìn)行;
7)注意相應(yīng)的可以在程序前部分加上setnoglob和結(jié)尾加上unset noglob;
8)注意在循環(huán)中一定要有變量發(fā)生變化,否則就會(huì)產(chǎn)生死循環(huán),導(dǎo)致程序失敗,
如下有一個(gè)判定的方式
set status = 1
sed –n ’‘ “l(fā)ine_current” ’s/pattern1/pattern2/p’$filename | grep ‘pattern2’
set flag = $status的方式,來(lái)判定程序是否進(jìn)行了匹配,當(dāng)然也有其它方式來(lái)判定;
9)注意一些細(xì)節(jié)上的東西,比如說(shuō).和_,1和l,0和o
Sed的debug方法
1)相應(yīng)的在相應(yīng)的變量下面將指定的變量echo出來(lái),或者echo一行數(shù)字來(lái)判斷代碼執(zhí)行到哪一行;
2)sh –x來(lái)執(zhí)行代碼,判定相應(yīng)的問(wèn)題;
Sed出現(xiàn)的錯(cuò)誤的類型:
1)Expression syntax相應(yīng)的表達(dá)式有錯(cuò)誤
2)還有的就是sed中)等沒有匹配,或者相應(yīng)的條件出現(xiàn)錯(cuò)誤。
3)還有就是parseerroe的問(wèn)題,解析錯(cuò)誤,程序中存在誤解,比如說(shuō)sed中的分隔符如果采用/的話,如果要替換的內(nèi)容中也存在這個(gè)/那么就可能會(huì)讓程序無(wú)法確定哪個(gè)部分該被替換,因而出現(xiàn)錯(cuò)誤。