Linux文本處理三劍客之--- sed的使用教程 sed

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

② 總結模式空間與保持空間關係:

保持空間是模式空間一個臨時存放數據的緩衝區,協助模式空間進行數據處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章