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

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


通用線程 -- sed 實(shí)例,第 3 部分
在這篇 sed 系列的總結(jié)性文章中,DanIEl Robbins 帶您體驗(yàn) sed 的真正力量 。在介紹完幾個(gè)重要的 sed 腳本之后,他將通過(guò)將一個(gè) Quicken .QIF 文件轉(zhuǎn)換成可讀文本格式來(lái)演示一些基本 sed 腳本的編寫(xiě) 。該轉(zhuǎn)換腳本不僅實(shí)用,而且還是展現(xiàn) sed 腳本編寫(xiě)能力的極佳示例 。強(qiáng)健的 sed
在第二篇 sed 文章中,我提供了一些示例來(lái)演示 sed 的工作原理,但是它們當(dāng)中很少有示例能實(shí)際做特別有用的事 。在這篇 sed 系列的最后文章中,我要改變那種方式,并使用 sed 來(lái)做實(shí)際的事 。我將為您顯示幾個(gè)示例,它們不僅演示 sed 的能力,而且還做一些真正巧妙(和方便)的事 。例如,在本文的后半部,將為您演示如何設(shè)計(jì)一個(gè) sed 腳本來(lái)將 .QIF 文件從 Intuit 的 Quicken 金融程序轉(zhuǎn)換成具有良好格式的文本文件 。在那樣做之前,我們將看一下不怎么復(fù)雜但卻很有用的 sed 腳本 。文本轉(zhuǎn)換
第一個(gè)實(shí)際腳本將 Unix 風(fēng)格的文本轉(zhuǎn)換成 Dos/Windows 格式 。您可能知道,基于 DOS/Windows 的文本文件在每一行末尾有一個(gè) CR(回車(chē))和 LF(換行),而 UNIX 文本只有一個(gè)換行 。有時(shí)可能需要將某些 UNIX 文本移至 Windows 系統(tǒng),該腳本將為您執(zhí)行必需的格式轉(zhuǎn)換 。$ sed -e "s/$/r/" myunix.txt > mydos.txt

在該腳本中,"$" 規(guī)則表達(dá)式將與行的末尾匹配,而 "r" 告訴 sed 在其之前插入一個(gè)回車(chē) 。在換行之前插入回車(chē),立即,每一行就以 CR/LF 結(jié)束 。請(qǐng)注意,僅當(dāng)使用 GNU sed 3.02.80 或以后的版本時(shí),才會(huì)用 CR 替換 "r" 。如果還沒(méi)有安裝 GNU sed 3.02.80,請(qǐng)?jiān)谖业牡谝黄?sed 文章中查看如何這樣做的說(shuō)明 。我已記不清有多少次在下載一些示例腳本或 C 代碼之后,卻發(fā)現(xiàn)它是 DOS/Windows 格式 。雖然很多程序不在乎 DOS/Windows 格式的 CR/LF 文本文件,但是有幾個(gè)程序卻在乎 -- 最著名的是 bash,只要一遇到回車(chē),它就會(huì)出問(wèn)題 。以下 sed 調(diào)用將把 DOS/Windows 格式的文本轉(zhuǎn)換成可信賴的 UNIX 格式:$ sed -e "s/.$//" mydos.txt > myunix.txt

該腳本的工作原理很簡(jiǎn)單:替代規(guī)則表達(dá)式與一行的最末字符匹配,而該字符恰好就是回車(chē) 。我們用空字符替換它,從而將其從輸出中徹底刪除 。如果使用該腳本并注意到已經(jīng)刪除了輸出中每行的最末字符,那么,您就指定了已經(jīng)是 UNIX 格式的文本文件 。也就沒(méi)必要那樣做了!反轉(zhuǎn)行
下面是另一個(gè)方便的小腳本 。與大多數(shù) Linux 發(fā)行版中包括的 "tac" 命令一樣,該腳本將反轉(zhuǎn)文件中行的次序 。"tac" 這個(gè)名稱可能會(huì)給人以誤導(dǎo),因?yàn)?"tac" 不反轉(zhuǎn)行中字符的位置(左和右),而是反轉(zhuǎn)文件中行的位置(上和下) 。用 "tac" 處理以下文件:foo bar oni

....將產(chǎn)生以下輸出:oni bar foo
【通用線程--sed 實(shí)例,第3部分】
可以用以下 sed 腳本達(dá)到相同目的:$ sed -e "1!G;h;$!d" forward.txt > backward.txt

如果登錄到恰巧沒(méi)有 "tac" 命令的 FreeBSD 系統(tǒng),將發(fā)現(xiàn)該 sed 腳本很有用 。雖然方便,但最好還是知道該腳本為什么那樣做 。讓我們對(duì)它進(jìn)行討論 。反轉(zhuǎn)解釋
首先,該腳本包含三個(gè)由分號(hào)隔開(kāi)的單獨(dú) sed 命令:"1!G"、"h" 和 "$!d" ?,F(xiàn)在,需要好好理解用于第一個(gè)和第三個(gè)命令的地址 。如果第一個(gè)命令是 "1G",則 "G" 命令將只應(yīng)用第一行 。然而,還有一個(gè) "!" 字符 -- 該 "!" 字符忽略該地址,即,"G" 命令將應(yīng)用到除第一行之外的所有行 。"$!d" 命令與之類(lèi)似 。如果命令是 "$d",則將只把 "d" 命令應(yīng)用到文件中的最后一行("$" 地址是指定最后一行的簡(jiǎn)單方式) 。然而,有了 "!" 之后,"$!d" 將把 "d" 命令應(yīng)用到除最后一行之外的所有行 ?,F(xiàn)在,我們所要理解的是這些命令本身做什么 。當(dāng)對(duì)上面的文本文件執(zhí)行反轉(zhuǎn)腳本時(shí),首先執(zhí)行的命令是 "h" 。該命令告訴 sed 將模式空間(保存正在處理的當(dāng)前行的緩沖區(qū))的內(nèi)容復(fù)制到保留空間(臨時(shí)緩沖區(qū)) 。然后,執(zhí)行 "d" 命令,該命令從模式空間中刪除 "foo",以便在對(duì)這一行執(zhí)行完所有命令之后不打印它 ?,F(xiàn)在,第二行 。在將 "bar" 讀入模式空間之后,執(zhí)行 "G" 命令,該命令將保留空間的內(nèi)容 ("foon") 附加到模式空間 ("barn"),使模式空間的內(nèi)容為 "barnfoon" 。"h" 命令將該內(nèi)容放回保留空間保護(hù)起來(lái),然后,"d" 從模式空間刪除該行,以便不打印它 。對(duì)于最后的 "oni" 行,除了不刪除模式空間的內(nèi)容(由于 "d" 之前的 "$!")以及將模式空間的內(nèi)容(三行)打印到標(biāo)準(zhǔn)輸出之外,重復(fù)同樣的步驟 。現(xiàn)在,要用 sed 執(zhí)行一些強(qiáng)大的數(shù)據(jù)轉(zhuǎn)換 。sed QIF 魔法

推薦閱讀