sed
3.1 認識sed
sed 是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(patternspace ),接着用sed 命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。然後讀入下行,執行下一個循環。如果沒有使諸如‘D’ 的特殊命令,那會在兩個循環之間清空模式空間,但不會清空保留空間。這樣不斷重複,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出或-i。
功能:主要用來自動編輯一個或多個文件, 簡化對文件的反覆操作
3.2 使用sed
3.2.1 命令格式
sed
[options]
'[地址定界] command'
file``(s)
3.2.2 常用選項options
- -n:不輸出模式空間內容到屏幕,即不自動打印,只打印匹配到的行
- -e:多點編輯,對每行處理時,可以有多個Script
- -f:把Script寫到文件當中,在執行sed時-f 指定文件路徑,如果是多個Script,換行寫
- -r:支持擴展的正則表達式
- -i:直接將處理的結果寫入文件
- -i.bak:在將處理的結果寫入文件之前備份一份
3.2.3 地址定界
- 不給地址:對全文進行處理
- 單地址:
- #: 指定的行
- /pattern/:被此處模式所能夠匹配到的每一行
- 地址範圍:
- #,#
- #,+#
- /pat1/,/pat2/
- #,/pat1/
-
~:步進
- sed -n '1~2p' 只打印奇數行 (1~2 從第1行,一次加2行)
- sed -n '2~2p' 只打印偶數行
3.2.4 編輯命令command
- d:刪除模式空間匹配的行,並立即啓用下一輪循環
- p:打印當前模式空間內容,追加到默認輸出之後
- a:在指定行後面追加文本,支持使用\n實現多行追加
- i:在行前面插入文本,支持使用\n實現多行追加
- c:替換行爲單行或多行文本,支持使用\n實現多行追加
- w:保存模式匹配的行至指定文件
- r:讀取指定文件的文本至模式空間中匹配到的行後
- =:爲模式空間中的行打印行號
- !:模式空間中匹配行取反處理
-
s///:查找替換,支持使用其它分隔符,如:s@@@,s###;
- 加g表示行內全局替換;
- 在替換時,可以加一下命令,實現大小寫轉換
- \l:把下個字符轉換成小寫。
- \L:把replacement字母轉換成小寫,直到\U或\E出現。
- \u:把下個字符轉換成大寫。
- \U:把replacement字母轉換成大寫,直到\L或\E出現。
- \E:停止以\L或\U開始的大小寫轉換
3.3 sed用法演示
3.3.1 常用選項options演示
qinwj 14:42:14 R290-1: /mnt/X500/farmers/qinwj
$ cat demo
aaa
bbbb
AABBCCDD
- p:打印當前模式空間內容,追加到默認輸出之後:匹配到的行會打印一遍,不匹配的行也會打印
$ sed /aa/p demo
aaa
aaa
bbbb
AABBCCDD
- -n 不顯示沒有匹配到的行
$ sed -n /aa/p demo
aaa
- -e 類似於多匹配; sed -e "s/a/A/ demo 表示將demo 文件裏面的a,變成A, 且只替換遇到的第一個
$ sed -e "s/a/A/" -e "s/b/B/" demo
Aaa
Bbbb
AABBCCDD
- -f 使用文件來處理
$ cat sedscirpts
s/A/a/g
$ sed -f sedscirpts demo
aaa
bbbb
aaBBCCDD
- -i 直接對文件進行處理
$ sed -i.bak "s/A/a/g" demo
$ cat demo
aaa
bbbb
aaBBCCDD
並且會自動生成改動前的.bak
的備份文件
$ cat demo.bak
aaa
bbbb
AABBCCDD
3.3.2 地址界定演示
$ cat demo
aaa
bbbb
AABBCCDD
aaaAAAbbbBBBcc
- 將第二行的b全部替換成B
$ sed "2s/b/B/g" demo
aaa
BBBB
AABBCCDD
aaaAAAbbbBBBcc
- 只打印匹配
aaa
模式的行
$ sed -n "/aaa/p" demo
aaa
aaaAAAbbbBBBcc
- 只打印前兩行
$ sed -n "1,2p" demo
aaa
bbbb
- 打印第2行到匹配
DD
行的
$ sed -n "2,/DD/p" demo
bbbb
AABBCCDD
- 將字段裏面的所有A或者a都替換成E
$ sed "1~2s/[aA]/E/g" demo
EEE
bbbb
EEBBCCDD
aaaAAAbbbBBBcc
3.3.3 編輯命令command演示
$ cat demo
aaa
bbbb
AABBCCDD
aaaAAAbbbBBBcc
-
d
表示刪除模式空間匹配的行
$ sed "2d" demo # 刪除第二行
aaa
AABBCCDD
aaaAAAbbbBBBcc
-
p
打印當前模式空間內容,追加到默認輸出之後, -n:不輸出模式空間內容到屏幕,即不自動打印,只打印匹配到的行
$ sed -n "2p" demo
bbbb
- a:在指定行後面追加文本,支持使用\n實現多行追加
$ sed "2a123" demo
aaa
bbbb
123
AABBCCDD
aaaAAAbbbBBBcc
- i:在行前面插入文本,支持使用\n實現多行追加
$ sed "1i123" demo
123
aaa
bbbb
AABBCCDD
aaaAAAbbbBBBcc
- c:替換行爲單行或多行文本,支持使用\n實現多行追加
$ sed "3c123\n456" demo #將第三行的內容替換成123\n456
aaa
bbbb
123
456
aaaAAAbbbBBBcc
- =:爲模式空間中的行打印行號
$ sed -n "=" demo
1
2
3
4
- !:模式空間中匹配行取反處理
$ sed -n '2!p' demo #打印除了第2行的內容
aaa
AABBCCDD
aaaAAAbbbBBBcc
將文本內容中的大寫都轉換成小寫
$ sed "s/[a-z]/\u&/g" demo
AAA
BBBB
AABBCCDD
AAAAAABBBBBBCC
這行命令同等於:
$ sed 's@[a-z]@\u&@g' demo
AAA
BBBB
AABBCCDD
AAAAAABBBBBBCC
3.4 sed高級編輯命令
(1)格式
- h:把模式空間中的內容覆蓋至保持空間中
- H:把模式空間中的內容追加至保持空間中
- g:從保持空間取出數據覆蓋至模式空間
- G:從保持空間取出內容追加至模式空間
- x:把模式空間中的內容與保持空間中的內容進行互換
- n:讀取匹配到的行的下一行覆蓋 至模式空間
- N:讀取匹配到的行的下一行追加 至模式空間
- d:刪除模式空間中的行
- D:刪除 當前模式空間開端至\n 的內容(不再傳 至標準輸出),放棄之後的命令,但是對剩餘模式空間重新執行sed
(2)一個案例+示意圖演示
① 案例:倒序輸出文本內容
$ cat num.txt
One
Two
Three
$ sed '1!G;h;$!d' num.txt
Three
Two
One
② 總結模式空間與保持空間關係:
保持空間是模式空間一個臨時存放數據的緩衝區,協助模式空間進行數據處理