Sed介紹
?SED,Stream EDitor,行編輯器。
?sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。然后讀入下行,執行下一個循環。如果沒有使諸如‘D’的特殊命令,那會在兩個循環之間清空模式空間,但不會清空保留空間。這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。
?功能:主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等。
sed和之前出現的grep、vim等文本編輯工具是不同的,vim是交互式操作的,sed是非交互式的。sed能夠根據給定的條件自動的逐行處理文件。grep也是逐行非交互的處理,grep主要是將匹配到的內容打印顯示,并沒有進行數據的更改。sed對匹配到的數據進行修改和調整,更加靈活的顯示用戶需要的內容,同時對部分內容進行更改。
sed具體的功能包括:數據的替換、刪除、新增等,這里的數據可以是一些關鍵字,也可以是一些特定的行。
Sed用法
用法:
sed [option]… ‘script’ inputfile…
?常用選項:
-n:不輸出模式空間內容到屏幕,即不自動打印
-e: 多點編輯( -e script1 -e script2 -e script3;)
-f:/PATH/SCRIPT_FILE: 從指定文件中讀取編輯腳本
-r: 支持使用擴展正則表達式
-i.bak: 備份文件并原處編輯,-i 直接修改源文件
?script:
‘地址命令’? 使用定位地址的方法,指明要操作的行,進入模式空間,腳本是必須要有的。
地址定界:
(1) 不給地址:對全文進行處理
(2) 單行定位:
#: 用數字指定的行,$:最后一行
/pattern/:被此處模式所能夠匹配到的每一行
(3) 行到行范圍定位:
n,m:都是數字定位的,表示從n到m行。
n,+m:都是數字,表示從n到 n+m行。
/pat1/,/pat2/:一般是正則表達匹配的字符串,從文本掃描時先掃描1,再掃描2,這個結束,還有文本,就重新再次掃描1,掃描到了,就操作,同時進行掃描2,若是2到結束也沒有掃描到,那就將剩下的全部操作。
#,/pat1/:第一個是數字,后面是正則表達匹配,由于行數是不會重復的,所以,會自動的到第一個匹配到的 pat1,結束。
(4) ~:步進
1~2 奇數行 ?? 從第一行開始,兩個作為一個循環,每個循環的第二個進行操作
2~2 偶數行 ? 從第二行開始,兩個作為一個循環,每個循環的第二個進行操作
編輯命令:
d: 刪除模式空間匹配的行,并立即啟用下一輪循環
p:打印當前模式空間內容,追加到默認輸出之后
a [\]text:在指定行后面追加文本
支持使用\n實現多行追加,追加是換行追加
i [\]text:在行前面插入文本
c [\]text:替換行為單行或多行文本
后續不能添加操作
w /path/somefile: 保存模式匹配的行至指定文件。若是要繼續操作,建議使用-e
r /path/somefile:讀取指定文件的文本至模式空間中。同上
匹配到的行后
=: 為模式空間中的行打印行號
!:模式空間中匹配行取反處理
s///:查找替換,支持使用其它分隔符,s@@@,s###
? ? ? ? ?? 替換標記:
g: 行內全局替換
p: 顯示替換成功的行
w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中
sed示例
?sed –n ‘2,/root/p’ /etc/passwd 從2行開始
?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 -n -e ‘/^$/p’ -e ‘/^$/=’ /etc/fstab 和 sed -n? ‘/^$/p;/^$/=’ /etc/fstab 結果是一樣的。
使用時注意分號隔開的方法
Sed高級用法
sed 工作機制是每次讀取一行文本至“模式空間”中,在模式空間中完成處理,將處理結果輸出至標準輸出設備,在模式空間中處理一行內容后會雞西處理下一行,那么對于處理過的行可能還有其他的處理,因此可以把處理過的行“傳送”至保持空間中,然后再后續的處理中再次“傳送”回模式空間中。這樣將類似加工車間和倉庫的概念,模式空間是加工車間,保持空間是倉庫,而倉庫中存儲的是些半成品。
高級編輯命令
?P:打印模式空間開端至\n內容,并追加到默認輸出之前;
?h: 把模式空間中的內容覆蓋至保持空間中;
?H:把模式空間中的內容追加至保持空間中內容的后面;
?g: 從保持空間取出數據并覆蓋至模式空間;
?G:從保持空間取出內容并追加至模式空間;
?x: 把模式空間中的內容與保持空間中的內容進行互換;
?n: 讀取匹配到的行的下一行覆蓋至模式空間(覆蓋原有內容);已經讀取的行不會再次讀取
?N:讀取匹配到的行的下一行追加至模式空間內容后面;已經讀取的行不會再次讀取
?d: 刪除模式空間中的內容
?D:刪除模式空間中的首行。
注意:命令功能可以使用 !取反,;分號用于分隔腳本。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/91197