第十二章
Sed
與
Awk
處理工具
內容:
12-1
串流編輯器
– sed
12-1-1 Sed
運作程序
串流編輯器(Stream
edit, sed)如同
vi(或
vim)一樣,都是文件編輯工具,編輯命令也幾乎是相同的。但兩者最大的不同點是,vi
屬於交談式的作業方式,而 sed
是批次處理模式。圖
12-1
為
sed
的文件編輯模式,文件由檔案起頭開始,依序進入
sed
文件編輯器,另外在 sed
命令上設定有若干的編輯命令。當檔案文件依序進入
sed
命令時, sed則會比較該文件是否有符合編輯條件,如果符合則編輯其內容,如不符合則依序讓文件通過;如此一來,文件就如同串流方式通過
sed
編輯器,並依序輸出編輯後的成果。
圖
12-1 sed
命令運作模式
12-1-2 sed
命令格式
Sed
如同一般命令,可在提示符號下直接輸入編輯,格式如下:
$ sed [option]
‘instruction’ file |
上述命令中包含了三個主要部分,第一者為選項(option),它供選擇
sed
的運作模式;第二部分利用兩個單引號包起來的編輯命令(如
‘instruction’),幾乎所有
vi
環境底下的編輯命令,這裡都可以使用;第三部分為串流輸入給
sed
命令編輯的檔案名稱。如果沒有輸出轉向的話(如 >
file_final),則編輯結果將直接顯示於終端機螢幕上。
(A)
【常用選項】
sed
命令的常用選項有:
Ø
-e:當同一命令行有多個編輯命令的話,則利用
–e
表示後面緊接著一個編輯命令。
Ø
-f script:可將編輯命令書寫成一個
script
檔案,並利用 –f
表示之。
Ø
-n:抑制輸入列的自動輸出。
(B)
【編輯命令】
無論
sed
或
vi
的編輯命令,幾乎都與 sed
相容,常用編輯命令有:
²
a(append):位置之後插入文字。如:‘1,
3a \good’,在第一與第三行之後插入
good
文字。
²
i(insert):位置之前插入文字。如:’1,
2i \good’,在第一與第二行之前插入
good
文字。
²
c(change):以文字取代指定範圍。如:’1,
2c \Good’,則表示第一與第二行,由
Good
文字取代。
²
d(delete):刪除範圍。如:’1,
2d’,表示刪除第一與第二行。
²
s(substitute):範圍內尋找字串並置換另一字串。如:’1,
2s/Good/Text/’,在第一與第二行內尋找
Good
字串,並以 Text
字串替換它。
²
p(print):列印範圍。如:’1,
2p’,表示印出第一與第二行。
²
q(quit):離開程式。
²
r(read):讀取檔案。如:’20
r file1’,讀入
file1
檔案內容,並置入於 20
行之前。
²
w(write):寫入檔案。如:’1,
4 w file1’,將第一到第四行內容,寫入到
file1
檔案內。
以下分別說明各編輯命令的使用方法。
12-1-3 sed
替換命令
替換命令的運作模式,首先搜尋文件中某一特定文字(或稱圖樣),再將它替換成另一段文字(或圖樣),命令格式如下:
‘[address]s/pattern/replacement/flags’ |
語法說明如下:
Ø
address:指定命令所處理對應的是哪幾列,如
1, 3
則表示由第 1
到第
3
列,如未指定則由搜尋 pattern
結果而定。
Ø
s:表示替換(substitution)命命。
Ø
pattern:所欲替換的原始圖樣(或文字),可利用正規式表示某一共通圖樣的格式。
Ø
replacement:替換後的新文字。
Ø
flags:是用來修飾替換命令,可能出現的有:
n
n:一個數字(1
~ 512),表示只當第
n
次出現該圖樣時,才進行替換的動作。
n
g:表示對圖樣空間(pattern
space)中出現的所有圖樣,都會進行替換的動作;如沒有指定
g,則只會處理第一次出現的圖樣。
n
p:印出圖樣空間的內容。
n
w file_name:將圖樣空間的內容寫入檔案內。
上述各種選項中,如果沒有指定範圍,則表示處理整個檔案內容。
【A.
替換範例一】
將
RedHat
檔案(可到 www.redhat.com
網站複製練習)內 Red Hat
字樣,替換成
RED HAT,操作範例如下:
$ cat
RedHat
The Fedora Project is a
Red Hat sponsored and community-supported
open source project. It
is not a supported product of Red Hat, Inc.
The goal? Work with the
Linux community to build a complete,
general purpose
operating system exclusively from free software.
$ sed
's/Red Hat/RED HAT/' RedHat
The Fedora Project is a
RED HAT sponsored and community-supported
open source project. It
is not a supported product of RED HAT, Inc.
The goal? Work with the
Linux community to build a complete,
general purpose
operating system exclusively from free software. |
【B.
替換範例二】
重複上一個範例,但僅搜尋處理第一行,操作範例如下:
$ sed
'1 s/Red Hat/RAD HAT/' RedHat
The Fedora Project is a
RAD HAT sponsored and community-supported
open source project. It
is not a supported product of Red Hat, Inc.
The goal? Work with the
Linux community to build a complete,
general purpose
operating system exclusively from free software. |
12-1-4 sed
刪除命令
刪除文件內某一段內容如同
vi 命令的
d 與
dd,是刪除某一行的意思;sed
有兩種方法來尋找所欲刪除的行,一者為直接表示刪除哪幾行的行號或範圍;另一者為搜尋符合條件的內容,如果符合的話則刪除該行的所有內容。命令格式如下:
‘[address]d’
或
‘/pettern/d’ |
其中,address
表示刪除某一行的行號,或某幾行的範圍;pattern
為搜尋的圖樣,可利用正規式表示。
【A.
刪除範例一】
我們利用
RedHat_1
檔案作為以下
sed
刪除命令的輸入範例;第一個範例是刪除檔案內第 2、3
行,操作範例如下:
[tsnien@Linux-1
tools]$ cat HatRed_1
The Fedora Project is a
Red Hat sponsored and community-supported
open source project. It
is not a supported product of Red Hat, Inc.
The goal? Work with the
Linux community to build a complete,
general purpose
operating system exclusively from free software.
[tsnien@Linux-1 tools]$ sed '2, 4d' HatRed_1
The Fedora Project is a
Red Hat sponsored and community-supported
The goal? Work with the
Linux community to build a complete,
general purpose
operating system exclusively from free software.
|
【B.
刪除範例二】
刪除
RedHat_1
檔案內的空白行,其刪除命令為
‘/^$/d’,其中
^
表示行的開頭、$
為行的結束位置,如果行的起頭與結束之間沒有任何字元的話,則表示該行為空白行。因此,此命令的意思是,只要找到某一空白行,便將該行刪除;操作如下:
[tsnien@Linux-1 tools]$ sed '/^$/d' HatRed_1
The Fedora Project is a
Red Hat sponsored and community-supported
open source project. It
is not a supported product of Red Hat, Inc.
The goal? Work with the
Linux community to build a complete,
general purpose
operating system exclusively from free software. |
【C.
刪除範例三】
刪除
RedHat_1
檔案內空白行與有
Red
字元的行,操作如下:
[tsnien@Linux-1
tools]$ sed -e '/Red/d' -e '/^$/d' HatRed_1
The goal? Work with the
Linux community to build a complete,
general purpose
operating system exclusively from free software. |
12-1-5 sed
插入/附加/變更命令
插入、附加與變更命令都是以『行』為執行對象,插入(insert)則表示在搜尋到的行之前一行,插入某一行文字;然而附加(append)則將文字放在所搜尋行的下一行;變更(change)則將所蒐尋的行,以另一行文字取代。命令格式如下:
附加:’[line-address]a\text’
插入:’[Line-address]i\text’
變更:’[address]c\text |
【A.
插入範例一】
將
Big
字元插入 RedHat
檔案內有出現
Red
字元的行之前一行,操作如下:
[tsnien@Linux-1
tools]$ sed '/Red/i\Big' RedHat
Big
The Fedora Project is a
Red Hat sponsored and community-supported
Big
open source project. It
is not a supported product of Red Hat, Inc.
The goal? Work with the
Linux community to build a complete,
general purpose
operating system exclusively from free software. |
【B.
附加範例一】
重複上述範例,但附加是插入指定行的下一行,操作如下:
tsnien@Linux-1 tools]$ sed '/Red/a\Big' RedHat
The Fedora Project is a
Red Hat sponsored and community-supported
Big
open source project. It
is not a supported product of Red Hat, Inc.
Big
The goal? Work with the
Linux community to build a complete,
general purpose
operating system exclusively from free software. |
【C.
附加範例二】
將
file_1
檔案內容附加到 RedHat
檔案內的第二行後面,操作如下:
[tsnien@Linux-1
tools]$ cat file_1
Is this a book?
Yes, this is a book
[tsnien@Linux-1 tools]$ sed '2r file_1' RedHat
The Fedora Project is a
Red Hat sponsored and community-supported
open source project. It
is not a supported product of Red Hat, Inc.
Is this a book?
Yes, this is a book
The goal? Work with the
Linux community to build a complete,
general purpose
operating system exclusively from free software. |
上述範例是讀入
file_1
檔案並附加在 RedHat
檔案的第二行後面。
【D.
變更範例一】
將
RedHat
檔案內有出現 Hat
的行,以
New-Fedora
字元取代該行,操作範例如下:
[tsnien@Linux-1
tools]$ sed '/Hat/c\New-Fedora' RedHat
New-Fedora
New-Fedora
The goal? Work with the
Linux community to build a complete,
general purpose
operating system exclusively from free software. |
12-1-6 sed
列印命令
搜尋或指定列印檔案內某些行的內容,命令格式如下:
【A.
列印範例一】
印出
RedHat
檔案內的第 2、3
行的內容。操作如下:
[tsnien@Linux-1
tools]$ sed -n '2, 3p' RedHat
open source project. It
is not a supported product of Red Hat, Inc.
The goal? Work with the
Linux community to build a complete, |
【C.
列印範例二】
印出
RedHat
檔案內有出現 Linux
字樣的行,操作如下:
[tsnien@Linux-1
tools]$ sed -n '/Linux/p' RedHat
The goal? Work with the
Linux community to build a complete, |
|