日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

通用線程--sed 實(shí)例,第3部分( 三 )


s/^07/Jul/ s/^08/Aug/
s/^09/Sep/ s/^10/Oct/
s/^11/Nov/ s/^12/Dec/
s:^(.*)/(.*)/(.*):2 1 3:
N N N
s/nT(.*)nN(.*)nP(.*)/NUM2NUMttYtt3tAMT1AMT/
s/NUMNUM/-/ s/NUM([0-9]*)NUM/1/
s/([0-9]),/1/ }

后七行有些復(fù)雜,所以將詳細(xì)討論它們 。首先,連續(xù)使用三個(gè) "N" 命令 。"N" 命令告訴 sed 將下一行讀入輸入中,然后將其附加到當(dāng)前模式空間 。這三個(gè) "N" 命令導(dǎo)致將下三行附加到當(dāng)前模式空間緩沖區(qū),現(xiàn)在這一行看起來如下:28 Aug 2000OUTYINNYnT-8.15nNnPCHECKCARD SUPERMARKET

sed 的模式空間變得很難看 -- 需要除去額外的新行,并執(zhí)行某些附加的格式化 。要這樣做,將使用替代命令 。要匹配的模式為:"nT.*nN.*nP.*"

這將與后面依次跟有 "T"、零或多個(gè)字符、新行、"N"、任何數(shù)量的字符、新行、"P"、以及任何數(shù)量字符的新行匹配 。呀!這個(gè)規(guī)則表達(dá)式將與剛剛附加到模式空間的三行的全部內(nèi)容匹配 。但我們要重新格式化該區(qū)域,而不是整個(gè)替換它 。美元金額、支票號(如果有的話)和描述需要出現(xiàn)在替換字符串中 。要這樣做,我們用帶有反斜杠的圓括號括起那些“感興趣部分”,以便可以在替換字符串中引用它們(使用 "1"、"2 和 "3" 來告訴 sed 將它們插入到何處) 。以下是最后的命令:s/nT(.*)nN(.*)nP(.*)/NUM2NUMttYtt3tAMT1AMT/

該命令將我們的行變換成:28 Aug 2000 OUTY INNY NUMNUM Y CHECKCARD SUPERMARKET AMT-8.15AMT

雖然該行正變得好一些,但是,有幾件事一看就有點(diǎn)...啊...有趣 。首先是那個(gè)愚蠢的 "NUMNUM" 字符串 -- 其目的何在?如果查看 sed 腳本的后兩行,就會(huì)發(fā)現(xiàn)其目的,后兩行將把 "NUMNUM" 替換成 "-",而把 "NUM""NUM" 替換成 。如您所見,用愚蠢的標(biāo)記括起支票號允許我們在該字段為空時(shí)方便地插入一個(gè) "-" 。結(jié)束嘗試
最后一行除去數(shù)字后的逗號 。它把如 "3,231.00" 這樣的美元金額轉(zhuǎn)換成我使用的格式 "3231.00" ?,F(xiàn)在,讓我們看一下最終腳本:最終的“QIF 到文本”腳本 1d /^^/d s/[[:cntrl:]]//g /^D/ { s/^D(.*)/1tOUTYtINNYt/
s/^01/Jan/ s/^02/Feb/ s/^03/Mar/ s/^04/Apr/ s/^05/May/
s/^06/Jun/ s/^07/Jul/ s/^08/Aug/ s/^09/Sep/ s/^10/Oct/
s/^11/Nov/ s/^12/Dec/ s:^(.*)/(.*)/(.*):2 1 3:
N N N s/nT(.*)nN(.*)nP(.*)/NUM2NUMttYtt3tAMT1AMT/
s/NUMNUM/-/ s/NUM([0-9]*)NUM/1/ s/([0-9]),/1/
/AMT-[0-9]*.[0-9]*AMT/b fixnegs
s/AMT(.*)AMT/1/ s/OUTY/-/ s/INNY/inco/
b done :fixnegs s/AMT-(.*)AMT/1/ s/OUTY/misc/
s/INNY/-/ :done }

附加的十一行使用替代和一些分支功能來美化輸出 。首先看一下這行:/AMT-[0-9]*.[0-9]*AMT/b fixnegs

該行包含一個(gè)格式為 "/regexp/b label" 的分支命令 。如果模式空間與規(guī)則表達(dá)式匹配,sed 將分支到 fixnegs 標(biāo)號 。您應(yīng)該可以輕易找到該標(biāo)號,它在代碼中為 ":fixnegs" 。如果規(guī)則表達(dá)式不匹配,則以常規(guī)方式繼續(xù)處理下一個(gè)命令 。既然您理解該命令本身的工作原理,讓我們看一下分支 。如果看一下分支規(guī)則表達(dá)式,將看到它與后面依次跟有 "-"、任意數(shù)量的數(shù)字、一個(gè) "."、任意數(shù)量的數(shù)字和 "AMT" 的字符串 "AMT" 匹配 。就象我確信您已猜到一樣,該規(guī)則表達(dá)式專門處理負(fù)的美元金額 。在這之前,用 "ATM" 括起美元金額,以便以后可以輕易找到它 。因?yàn)橐?guī)則表達(dá)式只與以 "-" 開始的美元金額匹配,所以,該分支只在恰巧處理借款時(shí)才發(fā)生 。如果正處理貸款,應(yīng)該將 OUTY 設(shè)置成 "misc",將 INNY 設(shè)置成 "-",并且應(yīng)該除去貸款數(shù)量前面的負(fù)號 。如果跟蹤代碼的流程,將看到實(shí)際情況正是這樣 。如果不執(zhí)行分支,則用 "-" 替換 OUTY,用 "inco" 替換 INNY 。完成了!現(xiàn)在輸出行是完美的:28 Aug 2000misc-- Y CHECKCARD SUPERMARKET -8.15

別犯糊涂
如您所見,只要循序漸進(jìn)地解決問題,使用 sed 轉(zhuǎn)換數(shù)據(jù)就沒有那么難 。不要試圖使用一個(gè) sed 命令或一下子解決所有問題 。相反,要朝著目標(biāo)逐步進(jìn)行,并不斷改進(jìn) sed 腳本,直到其輸出正如您希望那樣為止 。sed 有許多功能,希望您已非常熟悉其內(nèi)部工作原理并繼續(xù)努力以進(jìn)一步掌握它!

推薦閱讀