Linux -- sed命令(3)

8 使用 sed 處理文件
替換命令包含一些可以用於文件的標記。還有一些sed編輯器命令也可以實現同樣的目標,不需要非得替換文本。

8.1 寫入文件
w 命令用來向文件寫入行。該命令的格式如下:

[address]sed w filename

下面的例子是將數據流中的前兩行打印到一個文本文件中。

$ sed -n ‘1,2w test.txt’ data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
$ cat test.txt
This is line number 1.
This is line number 2.
如果要根據一些公用的文本值從主文件中創建一份數據文件,比如下面的郵件列表中的,那麼 w 命令會非常好用。

$ cat data11.txt
Blum, R Browncoat
McGuiness, A Alliance
Bresnahan, C Browncoat
Harken, C Alliance
$ sed -n ‘/Browncoat/w Browncoats.txt’ data11.txt
$ cat Browncoats.txt
Blum, R Browncoat
Bresnahan, C Browncoat
sed編輯器會只將包含文本模式的數據行寫入目標文件。

8.2 從文件讀取數據
讀取( read )命令( r )允許你將一個獨立文件中的數據插入到數據流中。讀取命令的格式如下:

[address]r filename

filename 參數指定了數據文件的絕對路徑或相對路徑。你在讀取命令中使用地址區間,只能指定單獨一個行號或文本模式地址。sed編輯器會將文件中的文本插入到指定地址後。

$ cat data12.txt
This is an added line.
This is the second added line.
$ sed ‘3r data12.txt’ data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is an added line.
This is the second added line.
This is line number 4.
sed編輯器會將數據文件中的所有文本行都插入到數據流中。同樣的方法在使用文本模式地址時也適用。

$ sed ‘/number 2/r data12.txt’ data6.txt
This is line number 1.
This is line number 2.
This is an added line.
This is the second added line.
This is line number 3.
This is line number 4.
$
如果你要在數據流的末尾添加文本,只需用美元符地址符就行了。

$ sed ‘$r data12.txt’ data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
This is an added line.
This is the second added line.
讀取命令的另一個很酷的用法是和刪除命令配合使用:利用另一個文件中的數據來替換文件中的佔位文本。舉例來說,假定你有一份套用信件保存在文本文件中:

$ cat notice.std
Would the following people:
LIST
please report to the ship’s captain.
$ cat data11.txt
Blum, R Browncoat
McGuiness, A Alliance
Bresnahan, C Browncoat
Harken, C Alliance
套用信件將通用佔位文本 LIST 放在人物名單的位置。要在佔位文本後插入名單,只需讀取命令就行了。但這樣的話,佔位文本仍然會留在輸出中。要刪除佔位文本的話,你可以用刪除命令。結果如下:

$ sed '/LIST/{
r data11.txt

d
}’ notice.std
Would the following people:
Blum, R Browncoat
McGuiness, A Alliance
Bresnahan, C Browncoat
Harken, C Alliance
please report to the ship’s captain.
首先使用文本尋址,在佔位文本LIST之後追加data11.txt的內容,之後d命令刪除佔位文本LIST,現在佔位文本已經被替換成了數據文件中的名單。

三、多行數據處理命令
有時,我們並不是僅僅對每一行單獨地進行操作,而是進行多行操作。比如查找一串字符,但這個字符可能分佈在兩行甚至多行;再比如,你要根據某一行的特徵對相鄰的幾行進行操作,等等。這時你就要用到多行操作命令了。

sed編輯器包含了三個可用來處理多行文本的特殊命令。

N :將數據流中的下一行加進來創建一個多行組(multiline group)來處理。
D :刪除多行組中的一行。
P :打印多行組中的一行。
後面幾節將會進一步講解這些多行命令並向你演示如何在腳本中使用它們。

1 next命令
在講解多行 next 命令之前,首先需要看一下單行版本的 next 命令是如何工作的,然後就比較容易理解多行版本的 next 命令是如何操作的了。

1.1 單行的 next 命令
n 命令可實現對匹配行的下一行文本進行處理,而不用重新回到命令的最開始再執行一遍。

在這個例子中,你有個數據文件,共有5行內容,其中的兩行是空的。目標是刪除首行之後的一行空白行,而留下其他的空白行。如果寫一個刪掉空白行的sed腳本,你會刪掉兩個空白行。

$ cat data1.txt
This is the header line.
This is a data line.
This is the last line.
$ sed ‘/^$/d’ data1.txt
This is the header line.
This is a data line.
This is the last line.
由於要刪除的行是空行,沒有任何能夠標示這種行的文本可供查找。解決辦法是用 n 命令。在這個例子中,腳本要查找含有單詞header的那一行。找到之後, n 命令會讓sed編輯器移動到文本的下一行,也就是那個空行。

$ sed ‘/header/{n ; d}’ data1.txt
This is the header line.
This is a data line.
This is the last line.
這時,sed編輯器會繼續執行命令列表,該命令列表使用 d 命令來刪除空白行。sed編輯器執行完命令腳本後,會從數據流中讀取下一行文本,並從頭開始執行命令腳本。因爲sed編輯器再也找不到包含單詞header的行了。所以也不會有其他行會被刪掉。

1.2 合併文本行
瞭解了單行版的 next 命令,現在來看看多行版的。單行 next 命令會將數據流中的下一文本行移動到sed編輯器的工作空間(稱爲模式空間)。多行版本的 next 命令(用大寫N)會將下一文本行添加到模式空間中已有的文後。這樣的作用是將數據流中的兩個文本行合併到同一個模式空間中。文本行仍然用換行符分隔,但sed編輯器現在會將兩行文本當成一行來處理。

如果要在數據文件中查找一個可能會分散在兩行中的文本短語的話,這是個很實用的應用程序。這裏有個例子。

$ cat data3.txt
On Tuesday, the Linux System
Administrator’s group meeting will be held.
All System Administrators should attend.
Thank you for your attendance.
$ sed ‘N ; s/System Administrator/Desktop User/’ data3.txt
On Tuesday, the Linux System
Administrator’s group meeting will be held.
All Desktop Users should attend.
Thank you for your attendance.
替換命令會在文本文件中查找特定的雙詞短語 System Administrator 。如果短語在一行中的話,事情很好處理,替換命令可以直接替換文本。但如果短語分散在兩行中的話,替換命令就沒法識別匹配的模式了。

這時 N 命令就可以派上用場了。同時也要加上短語不是分佈於兩行的情況。

$ sed 'N

s/System\nAdministrator/Desktop\nUser/
s/System Administrator/Desktop User/
’ data3.txt’ data3.txt
On Tuesday, the Linux Desktop User’s group meeting will be held.
All Desktop Users should attend.
Thank you for your attendance.
用 N 命令將發現第一個單詞的那行和下一行合併後,即使短語內出現了換行,你仍然可以找到它。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章