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

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


在本文章系列中,DanIEl Robbins 將為您演示如何使用功能十分強(qiáng)大(但常被遺忘)的 Unix 流編輯器 sed 。sed 是用批處理方式編輯文件或以十分有效的方式創(chuàng)建 shell 腳本以修改現(xiàn)有文件的理想工具 。
挑選編輯器
在 UNIX 世界中有很多文本編輯器可供我們選擇 。思考一下 -- vi、eMacs 和 jed 以及很多其它工具都會(huì)浮現(xiàn)在腦海中 。我們都有自己已逐漸了解并且喜愛的編輯器(以及我們喜愛的組合鍵) 。有了可信賴的編輯器,我們可以輕松處理任何數(shù)量與 UNIX 有關(guān)的管理或編程任務(wù) 。雖然交互式編輯器很棒,但卻有其限制 。盡管其交互式特性可以成為強(qiáng)項(xiàng),但也有其不足之處 ??紤]一下需要對(duì)一組文件執(zhí)行類似更改的情形 。您可能會(huì)本能地運(yùn)行自己所喜愛的編輯器,然后手工執(zhí)行一組煩瑣、重復(fù)和耗時(shí)的編輯任務(wù) 。然而,有一種更好的方法 。進(jìn)入 sed
如果可以使編輯文件的過程自動(dòng)化,以便用“批處理”方式編輯文件,甚至編寫可以對(duì)現(xiàn)有文件進(jìn)行復(fù)雜更改的腳本,那將太好了 。幸運(yùn)的是,對(duì)于這種情況,有一種更好的方法 -- 這種更好的方法稱為 "sed" 。sed 是一種幾乎包括在所有 UNIX 平臺(tái)(包括 Linux)的輕量級(jí)流編輯器 。sed 有許多很好的特性 。首先,它相當(dāng)小巧,通常要比您所喜愛的腳本語言小很多倍 。其次,因?yàn)?sed 是一種流編輯器,所以,它可以對(duì)從如管道這樣的標(biāo)準(zhǔn)輸入接收的數(shù)據(jù)進(jìn)行編輯 。因此,無需將要編輯的數(shù)據(jù)存儲(chǔ)在磁盤上的文件中 。因?yàn)榭梢暂p易將數(shù)據(jù)管道輸出到 sed,所以,將 sed 用作強(qiáng)大的 shell 腳本中長而復(fù)雜的管道很容易 。試一下用您所喜愛的編輯器去那樣做 。GNU sed
對(duì) Linux 用戶來說幸運(yùn)的是,最好的 sed 版本之一恰好是 GNU sed,其當(dāng)前版本是 3.02 。每一個(gè) Linux 發(fā)行版都有(或至少應(yīng)該有)GNU sed 。GNU sed 之所以流行不僅因?yàn)榭梢宰杂煞职l(fā)其源代碼,還因?yàn)樗∏捎性S多對(duì) POSIX sed 標(biāo)準(zhǔn)便利、省時(shí)的擴(kuò)展 。另外,GNU 沒有 sed 早期專門版本的很多限制,如行長度限制 -- GNU 可以輕松處理任意長度的行 。最新的 GNU sed
在研究這篇文章之時(shí)我注意到:幾個(gè)在線 sed 愛好者提到 GNU sed 3.02a 。奇怪的是,在ftp.gnu.org(有關(guān)這些鏈接,請(qǐng)參閱參考資料)上找不到 sed 3.02a,所以,我只得在別處尋找 。我在alpha.gnu.org 的 /pub/sed 中找到了它 。于是我高興地將其下載、編譯然后安裝,而幾分鐘后我發(fā)現(xiàn)最新的 sed 版本卻是 3.02.80 -- 可在alpha.gnu.org 上 3.02a 源代碼旁邊找到其源代碼 。安裝完 GNU sed 3.02.80 之后,我就完全準(zhǔn)備好了 。
正確的 sed
在本系列中,將使用 GNU sed 3.02.80 。在即將出現(xiàn)的本系列后續(xù)文章中,某些(但非常少)最高級(jí)的示例將不能在 GNU sed 3.02 或 3.02a 中使用 。如果您使用的不是 GNU sed,那么結(jié)果可能會(huì)不同 。現(xiàn)在為什么不花些時(shí)間安裝 GNU sed 3.02.80 呢?那樣,不僅可以為本系列的余下部分作好準(zhǔn)備,而且還可以使用可能是目前最好的 sed 。sed 示例
sed 通過對(duì)輸入數(shù)據(jù)執(zhí)行任意數(shù)量用戶指定的編輯操作(“命令”)來工作 。sed 是基于行的,因此按順序?qū)γ恳恍袌?zhí)行命令 。然后,sed 將其結(jié)果寫入標(biāo)準(zhǔn)輸出 (stdout),它不修改任何輸入文件 。讓我們看一些示例 。頭幾個(gè)會(huì)有些奇怪,因?yàn)槲乙盟鼈冄菔?sed 如何工作,而不是執(zhí)行任何有用的任務(wù) 。然而,如果您是 sed 新手,那么理解它們是十分重要的 。下面是第一個(gè)示例:
$ sed -e "d" /etc/services如果輸入該命令,將得不到任何輸出 。那么,發(fā)生了什么?在該例中,用一個(gè)編輯命令 "d" 調(diào)用 sed 。sed 打開 /etc/services 文件,將一行讀入其模式緩沖區(qū),執(zhí)行編輯命令(“刪除行”),然后打印模式緩沖區(qū)(緩沖區(qū)已為空) 。然后,它對(duì)后面的每一行重復(fù)這些步驟 。這不會(huì)產(chǎn)生輸出,因?yàn)?"d" 命令除去了模式緩沖區(qū)中的每一行!在該例中,還有幾件事要注意 。首先,根本沒有修改 /etc/services 。這還是因?yàn)?sed 只讀取在命令行指定的文件,將其用作輸入 -- 它不試圖修改該文件 。第二件要注意的事是 sed 是面向行的 。"d" 命令不是簡單地告訴 sed 一下子刪除所有輸入數(shù)據(jù) 。相反,sed 逐行將 /etc/services 的每一行讀入其稱為模式緩沖區(qū)的內(nèi)部緩沖區(qū) 。一旦將一行讀入模式緩沖區(qū),它就執(zhí)行 "d" 命令,然后打印模式緩沖區(qū)的內(nèi)容(在本例中沒有內(nèi)容) 。我將在后面為您演示如何使用地址范圍來控制將命令應(yīng)用到哪些行 -- 但是,如果不使用地址,命令將應(yīng)用到所有行 。第三件要注意的事是括起 "d" 命令的單引號(hào)的用法 。養(yǎng)成使用單引號(hào)來括起 sed 命令的習(xí)慣是個(gè)好注意,這樣可以禁用 shell 擴(kuò)展 。另一個(gè) sed 示例

推薦閱讀