sed(Stream Editor)簡介:
sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(patternspace),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕(STDOUT)。然后讀入下行,執行下一個循環。如果沒有使諸如’D’的特殊命令,那會在兩個循環之間清空模式空間,但不會清空保留空間。這樣不斷重復,知道文件末尾。文件內容并沒有改變,除非使用重定向存儲輸出。
sed與我們常用的vim的區別:
sed是非交互式的,而vim是交互式的,這意味著必須將要數據執行的命令插入到命令行或要處理的腳本中。Sed在一個文件或文件集中非交互式、并且不加詢問地接收一系列的命令并執行它們。sed的強大之處就是可以對文件或者文件集批量的進行刪除、替換、插入追加等操作,并且非常適合于重復的編輯,這種重復編輯如果由人工完成將花費大量的時間。
sed功能:
主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等
sed用法:
sed [option]… ‘script’ inputfile…
常用選項(option)
-n 使用安靜(silent)模式.sed默認的處理結果是輸出到STDOUT。但是如果加上-n參數后,則只有經過sed特殊處理的哪一行或者動作才會被別出來(與‘p’連用)
-e 直接在指令列模式上進行sed的動作編輯(多點編輯,可同時執行多條操作命令)
-f 直接將sed的動作寫在一個文件內,-f filename則可以執行filename內的sed動作
-r 支持使用擴展正則表達式
-i 直接修改讀取的文件內容,而不是由STDOUT輸出
-i.bak 備份文件并原處編輯
script:
‘地址命令’
地址界定:
1、不給地址:對全文進行處理
2、單地址:
#:指定的行,$: 最后一行
/pattern/: 被此處模式所能夠匹配到的每一行
3、地址范圍
#,# 從某一行到某一行
#,+# 從某一行到該行后的第幾行
/pat1/,/pat2/ 從pat1匹配到的行到pat2匹配到的行
#,/pat1/ 從某一行到匹配到pat1的行
4、~: 步進
1~2 奇數行
2~2 偶數行
編輯命令:
d: 刪除模式空間匹配的行,并立即啟用下一輪循環
p: 打印當前模式空間內容,追加到默認輸出之后
a [\]text: 在指定行后面追加文本,支持使用\n實現多行追加
將 this is a test line 追加到 以test 開頭的行后面:
sed ‘/^test/a\this is a test line’ file
在 test.conf 文件第2行之后插入 this is a test line:
sed -i ‘2a\this is a test line’ test.conf
i [\]text:在行前面插入文本
將 this is a test line 追加到以test開頭的行前面:
sed ‘/^test/i\this is a test line’ file
在test.conf文件第5行之前插入this is a test line:
sed -i ‘5i\this is a test line’ test.conf
c [\]text:替換行為單行或多行文本
w /path/somefile: 保存模式匹配的行至指定文件
r /path/somefile: 讀取指定文件的文本至模式空間中匹配到的行后
=:為模式空間中的行打印行號
!:模式空間中匹配行取反處理
s///: 查找替換,支持使用其他分隔符,s@@@,s###
替換標記
g: 行內全局替換
p: 顯示替換成功的行
w /PATH/TO/SOMEFILE: 將替換成功的行保存至文件中
sed元字符集:
^ 匹配行開始,如:/^sed/匹配所有以sed開頭的行。
$ 匹配行結束,如:/sed$/匹配所有以sed結尾的行。
. 匹配一個非換行符的任意字符,如:/s.d/匹配s后接一個任意字符,最后是d。
* 匹配0個或多個字符,如:/*sed/匹配所有模板是一個或多個空格后緊跟sed的行。
[] 匹配一個指定范圍內的字符,如/[ss]ed/匹配sed和Sed。
[^] 匹配一個不在指定范圍內的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行。
\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers。
& 保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**。
\< 匹配單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行。
\> 匹配單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。
x\{m\} 重復字符x,m次,如:/0\{5\}/匹配包含5個0的行。
x\{m,\} 重復字符x,至少m次,如:/0\{5,\}/匹配至少有5個0的行。
x\{m,n\} 重復字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10個0的行。
sed示例:
sed ‘2p’ /etc/passwd 輸出所有內容并第二行多顯示一次
sed -n ‘2p’ /etc/passwd 輸出第二行
sed -n ‘1,4p’ /etc/passwd 輸出1至4行
sed -n ‘/root/p’ /etc/passwd 顯示包含root的行
sed -n ‘2,/root/p’ /etc/passwd 從第二行開始
sed -n ‘/^$/=’ file 顯示空行行號
sed -n -e ‘/^$/p’ -e ‘/^$/=’ file? 先輸出空行,然后輸出空行行號
sed ‘/root/a\superman’ /etc/passwd 行后
sed ‘/root/i\superman’ /etc/passwd 行前
sed ‘/root/c\superman’ /etc/passwd 代替行
sed ‘/^$/d’ file 刪除空行
sed ‘1,10d’ file 刪除1至10行
nl /etc/passwd | sed ‘2,5d’ 刪除2至5行
nl /etc/passwd | sed ‘2a tea’ 第二行最后添加tea
sed -n ‘s/root/&superman/p’ /etc/passwd 單詞前
sed -n ‘s/root/superman&/p’ /etc/passwd 單詞后
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets 搜索dog替換成cat,然后搜索hi替換成lo
sed -i.bak ‘s/dog/cat/g’ pets 備份文件pets.bak 將原文件中的dog替換成cat
高級編輯命令:
P:打印模式空間開端至\n內容,并追加到默認輸出之前
h:把模式空間中的內容覆蓋至保持空間中
H:把模式空間的內容追加至保持空間中
g:從保持空間取出數據覆蓋至模式空間
G:從保持空間取出數據追加至模式空間
x:把模式空間中的內容與保持空間的內容進行互換
n:讀取匹配到的行的下一行覆蓋至模式空間
N:讀取匹配到的行的下一行追加至模式空間
d:刪除模式空間中的行
D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,并不會讀取新的輸入行,而使用合成的模式空間重新啟動循環。如果模式空間不包含換行符,則會像發出d命令那樣啟動正常的新循環
sed示例:
sed -n ‘n;p’ FILE 偶數行
sed ‘1!G;h;$!d’ FILE 倒序
sed ‘N;D’ FILE 最后一行
sed ‘$!N;$!D’ FILE 最后兩行
sed ‘$!d’ FILE 最后一行
sed ‘G’ FILE 每行后面加一行空行
sed ‘g’ FILE 每行被空行替換
sed ‘/^$/d;G’ FILE 先把空行刪除,然后在每一行的后面添加一行空行
sed ‘n;d’ FILE 奇數行
sed -n ‘1!G;h;$p’ FILE 倒序
想了解更多sed的用法可以查看下面的網址:
http://www.gnu.org/software/sed/manual/sed.html
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/89793