sed 是1種在線編輯器,它1次處理1行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下1行,這樣不斷重復,直到文件末尾。文件內容并沒有 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯1個或多個文件;簡化對文件的反復操作;編寫轉換程序等。
sed是1個很好的文件處理工具,本身是1個管道命令,主要是以行動單位進行處理,可以將數據行進行替換、刪除、新增、選取等特定工作,下面先了解1下sed的用法
sed命令行格式為:
sed [-nefri] ‘command’ 輸入文本
經常使用選項:
-n∶使用安靜(silent)模式。在1般 sed 的用法中,所有來自 STDIN的資料1般都會被列出到螢幕上。但如果加上 -n 參數后,則只有經過sed 特殊處理的那1行(或動作)才會被列出來。
-e∶直接在指令列模式上進行 sed 的動作編輯;
-f∶直接將 sed 的動作寫在1個檔案內, -f filename 則可以履行 filename 內的sed 動作;
-r∶sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)
-i∶直接修改讀取的檔案內容,而不是由螢幕輸出。
經常使用命令:
a ∶新增, a 的后面可以接字串,而這些字串會在新的1行出現(目前的下1行)~
c ∶取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!
d ∶刪除,由于是刪除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而這些字串會在新的1行出現(目前的上1行);
p ∶列印,亦行將某個選擇的資料印出。通常 p 會與參數 sed -n 1起運作~
s ∶取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!
舉例:(假定我們有1文件名為ab)
刪除某行
[root@localhost ruby] # sed '1d' ab #刪除第1行
[root@localhost ruby] # sed '$d' ab #刪除最后1行
[root@localhost ruby] # sed '1,2d' ab #刪除第1行到第2行
[root@localhost ruby] # sed '2,$d' ab #刪除第2行到最后1行
顯示某行
. [root@localhost ruby] # sed -n '1p' ab #顯示第1行
[root@localhost ruby] # sed -n '$p' ab #顯示最后1行
[root@localhost ruby] # sed -n '1,2p' ab #顯示第1行到第2行
[root@localhost ruby] # sed -n '2,$p' ab #顯示第2行到最后1行
使用模式進行查詢
[root@localhost ruby] # sed -n '/ruby/p' ab #查詢包括關鍵字ruby所在所有行
[root@localhost ruby] # sed -n '/$/p' ab #查詢包括關鍵字$所在所有行,使用反斜線屏蔽特殊含義
增加1行或多行字符串
[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1a drink tea' ab #第1行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1,3a drink tea' ab #第1行到第3行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
drink tea
end
drink tea
[root@localhost ruby] # sed '1a drink tea
or coffee' ab #第1行后增加多行,使用換行符
Hello!
drink tea
or coffee
ruby is me,welcome to my blog.
end
代替1行或多行
[root@localhost ruby] # sed '1c Hi' ab #第1行代替為Hi
Hi
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1,2c Hi' ab #第1行到第2行代替為Hi
Hi
end
替換1行中的某部份
格式:sed 's/要替換的字符串/新的字符串/g'
(要替換的字符串可以用正則表達式)
[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #替換ruby為bird
[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g' #刪除ruby
插入
[root@localhost ruby] # sed -i '$a bye' ab #在文件ab中最后1行直接輸入"bye"
[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
bye
搜索 /etc/passwd有root關鍵字的行
如果root找到,除輸出所有行,還會輸出匹配行。
使用-n的時候將只打印包括模板的行。
刪除/etc/passwd所有包括root的行,其他行輸出
找到匹配模式eastern的行后,
搜索/etc/passwd,找到root對應的行,履行后面花括號中的1組命令,每一個命令之間用分號分隔,這里把bash替換為blueshell,再輸出這行:
如果只替換/etc/passwd的第1個bash關鍵字為blueshell,就退出
最后的q是退出。
除整行的處理模式以外, sed 還可以用行動單位進行部份數據的搜索并取代。基本上 sed 的搜索與替換的與 vi 相當的類似!他有點像這樣:
先視察原始信息,利用 /sbin/ifconfig 查詢 IP
本機的ip是192.168.1.100。
將 IP 前面的部份予以刪除
接下來則是刪除后續的部份,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
將 IP 后面的部份予以刪除
1條sed命令,刪除/etc/passwd第3行到末尾的數據,并把bash替換為blueshell
-e表示多點編輯,第1個編輯命令刪除/etc/passwd第3行到末尾的數據,第2條命令搜索bash替換為blueshell。
sed 可以直接修改文件的內容,沒必要使用管道命令或數據流重導向! 不過,由於這個動作會直接修改到原始的文件,所以請你千萬不要隨意拿系統配置來測試! 我們還是使用下載的 regular_express.txt 文件來測試看看吧!
利用 sed 將 regular_express.txt 內每行結尾若為 . 則換成 !
利用 sed 直接在 regular_express.txt 最后1行加入『# This is a test』
由於 $ 代表的是最后1行,而 a 的動作是新增,因此該文件最后新增『# This is a test』!
sed 的『 -i 』選項可以直接修改文件內容,這功能非常有幫助!舉例來講,如果你有1個 100 萬行的文件,你要在第 100 行加某些文字,此時使用 vim 可能會瘋掉!由于文件太大了!那怎辦?就利用 sed 啊!透過 sed 直接修改/取代的功能,你乃至不需要使用 vim 去修訂!
參考 http://vbird.dic.ksu.edu.tw/linux_basic/0330regularex_2.php#sed
http://www.cnblogs.com/stephen-liu74/archive/2011/11/17/2245130.html
上一篇 使用grep快速定位代碼位置
下一篇 Paint類常用方法