三劍客命令之Sed的用法總結
sed是Linux系統中最為廣泛使用的命令行編輯器,sed本身也是一個管道命令,可將數據進行替換/刪除/新增/選取等功能。sed命令的執行過程大致如下:
1)一次從輸入中讀取一行數據;2)根據所提供的編輯器命令匹配數據;3)按照命令修改流中的數據;4)將新的數據輸出到STDOUT
sed命令格式如下:
[root@centos7-magedu ~]# sed [-nefr] [動作]
-n 靜默模式,只有經過sed特殊處理的行才能夠顯示出來;
-e 命令行模式的sed編輯,常用來分隔多個動作;
-f 直接將sed的動作寫入一個文件,-f filename則可執行filename內的sed命令
-r 支持拓展正則表達式(默認為基本正則表達式)
-i 修改文件內容並保存,後緊跟.bak可對將原文件另存為(filename.bak)(任意名稱均可)
function 有這些參數:
a:行後新增,往往接字符串
c:替換,往往與地址定界配合使用
d:刪除,通常其後不接任何參數
i:行前新增,字符串出現在當前行的上一行
p:打印,如只顯示第二行 sed -n ‘2p’
s:替換,通常與正則表達式配合使用,多用於文本行內的過濾和字符串替換
下面重點說明下 sed命令下的替換選項:
1.替換標記
使用sed將文本內的test替換為trial
由此看出,默認情況下只替換每行中出現的第一處,下面有4中可用的標記:
1>數字,表明新文本將替換第幾處模式匹配的地方;2>g,表明新文本將替換所有匹配的文本;3>p,表明原先行的內容要打印;4>w file,將替換的結果寫到文件中
2.替換字符
當用傳統的/替換文件中的路徑名時,往往比較麻煩,例如用C shell替換/etc/passwd文件中的bash shell,必須這麽做:
sed ‘s/\/bin\/bash/\/bin\/csh/’ /etc/passwd,這通常會帶來困惑和錯誤,此時可用@替代
sed ‘s@/bin/bash@/bin/csh@’ /etc/passwd
3.過濾文本中的單詞
例題:用sed命令統計/etc/init.d/functions文件中每個單詞的出現次數,並排序
分析:對單行進行正向截取很難,因為‘s@.*[^[:alpha:]](\<[[:alpha:]]+\>).*@\1@p’一行只能替換一個單詞,所以只能用反向截取,考慮將除了單詞外的字符轉換成換行:
第二部分介紹高級編輯命令
P:打印模式空間開端至\n內容,並追加到默認輸出之前
h:把模式空間的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g:從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x:把模式空間中的內容與保持空間中的內容進行互換
n:讀取匹配到的行的下一行覆蓋至模式空間
N:讀取匹配到的行的下一行追加至模式空間
d:刪除模式空間中的行
D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,並不會讀取新的輸入行,而使用合成的模式空間啟動新循環。如果模式空間不包含換行符,則會像發出d命令那樣啟動正常的新循環。
上述高級編輯命令可進行如下組合:
‘n;p‘ 輸出偶數行
‘n;d‘ 只顯示奇數行
‘g‘ 所有行變為空行
‘$!N;$!D‘ 輸出倒數後兩行
‘N;D‘只輸出最後一行
‘1!G;h;$!d‘倒序輸出
例:將文本文件的n和n+1行合並為一行,n為奇數行
三劍客命令之Sed的用法總結