sed高階用法 sed編輯器 sed是一種流編輯器,流編輯器會在編輯器處理數據之前基於預先提供的一組規則來編輯數據流。 1.sed編輯器工作流程 sed編輯器可以根據命令來處理數據流中的數據,這些命令要麼從命令行中輸入,要麼存儲在一個命令文本文件中。 sed的工作流程主要包括讀取、執行和顯示三個過程 ...
sed高階用法
sed編輯器
sed是一種流編輯器,流編輯器會在編輯器處理數據之前基於預先提供的一組規則來編輯數據流。
1.sed編輯器工作流程
sed編輯器可以根據命令來處理數據流中的數據,這些命令要麼從命令行中輸入,要麼存儲在一個命令文本文件中。 sed的工作流程主要包括讀取、執行和顯示三個過程:
- 讀取: sed從輸入流 (文件、管道、標準輸入) 中讀取一行內容並存儲到臨時的緩衝區中(又稱模式空間,pattern space)
- 執行:預設情況下,所有的sed命令都在模式空間中順序地執行,除非指定了行的地址,否則sed命令將會在所有的行上依次執行
- 顯示:發送修改後的內容到輸出流。在發送數據後,模式空間將會被清空。在所有的文件內容都被處理完成之前,上述過程將重覆執行,直至所有內容被處理完。
模式空間和保持空間
模式空間:sed處理文本內容行的一個臨時緩衝區,模式空間中的內容會主動列印到標準輸出,並自動清空模式空間
保持空間:sed處理文本內容行的另一個臨時緩衝區,不同的是保持空間內容不會主動清空,也不會主動列印到標準輸出,而是需要sed命令來進行處理
模式空間與保持空間的關係
模式空間:相當於流水線,文本行再模式空間中進行處理;
保持空間:相當於倉庫,在模式空間對數據進行處理時,可以把數據臨時存儲到保持空間;作為模式空間的一個輔助臨時緩衝區,但又是相互獨立,可以進行交互,命令可以定址模式空間但是不能定址保持空間。可以使用高級命令h,H,g,G與模式空間進行交互。
sed命令參數
-n 使用安靜模式.則只有經過sed特殊處理的哪一行才會被列出來
-e 傳送帶(前面執行完傳遞給後面)
-f 跟隨腳本文件名
-r 脫意
-i 直接修改讀取文件
sed命令詳解
替換標記
g:表示行內全面替換
w:表示把行寫入一個文件
x:表示互換模式空間的文本和保持空間的文本
y:表示把一個字元翻譯為另外的字元(不用於正則表達式)
單行模式空間
a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)
c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
d :刪除,因為是刪除,所以 d 後面通常不接任何東東;
i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
p :列印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行
s :取代,通常這個 s 的動作可以搭配正則表達式!例如 1,20s/old/new/g
n:讀取下一個輸入行, 用下一個命令處理新的行
y:把一個或多個字元替換成另一個字元
示例:
#初始
root@localhost ~]# cat test
a b c
b
c
d
//a的用法
#選擇行下添加
[root@localhost ~]# sed '2a123321' test
a b c
b
123321
c
d
#在匹配的參數下一行進行添加
[root@localhost ~]# sed '/c/a123321' test
a b c
123321
b
c
123321
d
//c的用法
[root@localhost ~]# cat test
a b c
b
c
d
#選擇行進行修改
[root@localhost ~]# sed '3caaa' test
a b c
b
aaa
d
#將匹配到的參數進行修改
[root@localhost ~]# cat test
a b c
b
c
d
[root@localhost ~]# sed '/d/caaa' test
a b c
b
c
aaa
//d的用法
[root@localhost ~]# cat test
a b c
b
c
d
#將第一行刪除
[root@localhost ~]# sed '1d' test
b
c
d
#將匹配到的行刪除
[root@localhost ~]# cat test
a b c
b
c
d
[root@localhost ~]# sed '/b/d' test
c
d
//i的用法
#選擇行進行插入
[root@localhost ~]# cat test
a b c
b
c
d
[root@localhost ~]# sed '3i123' test
a b c
b
123
c
d
#在匹配的參數前一行進行插入、
[root@localhost ~]# cat test
a b c
b
c
d
[root@localhost ~]# sed '/b/i123' test
123
a b c
123
b
c
d
//p的用法
[root@localhost ~]# cat test
a b c
b
c
d
[root@localhost ~]# sed -n '/a/p' test //-n選項:只顯示匹配處理的行(否則會輸出所有)(也就是關閉預設的輸出)
a b c
//s的用法
#將匹配的每行里的第一個參數進行替換
[root@localhost ~]# cat test
a b c
b
c
d
[root@localhost ~]# sed 's/b/c/' test
a c c
c
c
d
#如果一行類出現多次參數,就會出現以下問題
[root@localhost ~]# cat test
a b c
b
c
d
aa
ac
[root@localhost ~]# sed 's/a/c/' test
c b c
b
c
d
ca
cc
#想要全部替換需要在最後加上g
[root@localhost ~]# cat test
a b c
b
c
d
aa
ac
[root@localhost ~]# sed 's/a/c/g' test
c b c
b
c
d
cc
cc
//n的用法,n讀取下一個輸入行
#此處的n不是sed -n的n的那種用法
[root@localhost ~]# cat test
a b c
b
c
d
aa
ac
[root@localhost ~]# sed -n '/a/n;p' test //匹配到的參數下麵的所有行
b
c
d
ac
//y的用法
#將匹配到的整行都進行修改
[root@localhost ~]# cat test
a b c
b
c
d
aa
ac
[root@localhost ~]# sed '5y/a/C/' test
a b c
b
c
d
CC
ac
多行空間模式
N:讀取匹配到的行的下一行追加至模式空間
P:列印模式空間開端至\n內容,並追加到預設輸出之前
D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本, 並不會讀取新的輸入行,而使用合成的模式空間重新啟動迴圈。如果模式空間 不包含換行符,則會像發出d命令那樣啟動正常的新迴圈
示例:
[root@localhost ~]# cat test
here are examples of the UNIX
System. Where UNIX
System appears, it should be the UNIX
Operating System.
[root@localhost ~]# sed '/UNIX$/{N;/\nSystem/s// Operating &/;P;D}' test
here are examples of the UNIX Operating
System. Where UNIX Operating
System appears, it should be the UNIX
Operating System.
常用命令
h:把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g:從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x:把模式空間中的內容與保持空間中的內容進行互換
示例
[root@localhost ~]# cat test
1
2
11
22
111
222
#匹配有1的行,h將將模式空間的內容追加到保持空間,d刪除模式空間的內容
[root@localhost ~]# sed '/1/{h;d}' test
2
22
222
此時
模式空間:
空
保持空間:
1
11
111
#匹配有2的行,G將保持空間的內容追加到模式空間
[root@localhost ~]# sed '/1/{h;d};/2/{G}' test
2
1
22
11
222
111
此時
模式空間:
2
1
22
11
222
111