三劍客之 Sed 編輯器
阿新 • • 發佈:2021-08-05
sed編輯器
sed是一種流編輯器,流編輯器會在編輯器處理資料之前基於預先提供的一組規則來編輯資料流。
sed編輯器可以根據命令來處理資料流中的資料,這些命令要麼從命令列中輸入,要麼儲存在一個命令文字檔案中。
工作流程
sed 的工作流程主要包括讀取、執行和顯示三個過程
- 讀取∶ sed 從輸入流(檔案、管道、標準輸入)中讀取一行內容並存儲到臨時的緩衝區中 (又稱模式空間,pattern space)
- 執行:預設情況下,所有的sed 命令都在模式空間中順序地執行,除非指定了行的地址, 否則sed 命令將會在所有的行上依次執行
- 顯示∶傳送修改後的內容到輸出流。在傳送資料後, 模式空間將會被清空。在所有的檔案內容都被處理完成之前,上述過程將重複執行,直至所有內容被處理完
在所有的檔案內容都被處理完成之前,上述過程將重複執行, 直至所有內容被處理完
注意∶ 預設情況下所有的sed命令都是在模式空間內執行的,因此輸入的檔案並不會發生任何變化,除非是用重定向儲存輸出。
命令格式
1 第一種: 2 sed -e '操作' 檔案1 檔案2 3 4 第二種: 5 sed -n -e '操作' 檔案1 檔案2 6 7 第三種: 8 sed -f 指令碼檔案 檔案1 檔案2 9 10 第四種: 11 sed -i -e '操作' 檔案1 檔案2
1 sed -e 'n{ 2 操作1 3 操作2 4 ... 5 }’ 檔案1 檔案2 ...
常用選項
1 -e 或--expression=: 表示用指定命令來處理輸入的文字檔案,只有一個操作命令時可省略,一般在執行多個操作命令使用 2 3 -f 或--file=: 表示用指定的指令碼檔案來處理輸入的文字檔案 4 5 -h 或--help: 顯示幫助 6 7 -n、--quiet 或 silent: 禁止sed編輯器輸出,但可以與p命令一起使用完成輸出 8 9 -i: 直接修改目標文字檔案
常用操作
s: 替換,替換指定字元
d: 刪除,刪除選定的行
a: 增加,在當前行下面增加一行指定內容
i: 插入,在選定行上面插入一行指定內容
c: 替換,將選定行替換為指定內容
y: 字元轉換,轉換前後的字元長度必須相同
p: 列印,如果同時指定行,表示列印指定行;如果不指定行,則表示列印所有內容;如果有非列印字元,則以ASCII碼輸出。其通常與“-n”選項一起使用
=: 列印行號
l (小寫): 列印資料流中的文字和不可列印的ASCII字元(比如結束符$、製表符\t)
列印內容
1 sed -n- e 'p' testfile1 2 sed -n -e '=' testfile1 3 sed -n -e 'l' testfile1 4 sed--n -e '=;p' testfile1 5 sed -n -e '=' -e 'p' testfile1 6 7 sed -n ' 8 > = 9 > p 10 > ' testfile1
使用地址
sed編輯器有2種定址方式:
- 以數字形式表示行區間
- 用文字模式來過濾出行
1 sed -n '1p' testfile1 2 3 sed -n '$p' testfile1 4 5 sed -n '1, 3p' testfile1 6 7 sed -n '3, $p' testfilel 8 9 sed -n '1, +3p' testfilel #列印1之後的連續3行,即1-4行 10 11 sed '5q' testfile1 #列印前5行資訊後退出,q表示退出 12 13 sed -n 'p;n' testfile1 #列印奇數行; n表示移動到下一行 14 15 sed -n 'n;p' testfile1 #列印偶數行 16 17 sed -n '2,${n;p}' testfile1 18 19 sed -n '/user/p' /etc/passwd 20 21 sed -n '/^a/p' /etc/passwd 22 23 sed -n '/bash$/p' /etc/passwd 24 25 sed -n '/ ftp\|root/p' /etc/passwd 26 27 sed -n '2, /nobody/p' /etc/passwd 28 29 sed -n '2, /nobody/=' /etc/passwd 30 31 sed -nr '/ro{1, }t/p' /etc/passwd #-r表示支援擴充套件正則表示式
以數字形式表示行區間
列印文字的奇數和偶數行
刪除行
1 sed 'd' testfile1 #全刪 2 3 sed '3d' testfile1 4 5 sed '2, 4d' testfile1 6 7 sed '$d' testfile1 8 9 sed '/^$/d' testfile1 #刪除空行 10 11 sed '/nologin$/d' /etc/passwd 12 13 sed '/nologin$/!d' /etc/passwd #“!"表示取反操作 14 15 sed '/2/,/3/d' testfile2 #從第一-個位置開啟行刪除功能,到第二個位置關閉行刪除功能 16 sed '/1/,/3/d' testfile2
刪除以指定字元結尾的行及取反
刪除一個區間的行
替換
行範圍 s/舊字串/新字串/替換標記
四種替換標記
數字:表明新字串將替換第幾處匹配的地方
g:表明新字串將會替換所有匹配的地方
P:列印與替換命令匹配的行,與-n一起使用
w檔案:將替換的結果寫到檔案中
1 sed -n 's/root/admin/p' /etc/passwd 2 3 sed -n 's/root/admin/2p' /etc/passwd 4 5 sed -n 's/root/admin/gp' /etc/passwd 6 7 sed 's/root//g' /etc/passwd 8 9 sed '1,20 s/^/#/' /etc/passwd 10 11 sed '/^root/ s/$/#/' /etc/passwd 12 13 sed -f script.sed testfile2 14 15 sed '1,20w out.txt' /etc/passwd 16 17 sed '1,20 s/^/#/w out.txt' /etc/passwd 18 19 sed -n 's/\/bin\/bash/\/bin\/csh/p' /etc/passwd 20 sed -n 's! /bin/bash! /bin/csh!p' /etc/passwd #使用“!”作為字串分隔符 21 sed -i 's9\945\9\99\98\939g' test.txt #將94599替換為98939
插入
1 sed '/45/c ABC' testfile2 2 3 sed '/45/ y/45/AB/' testfile2 4 5 sed '1,3a ABC' testfile2 6 7 sed '1i ABC' testfile2 8 9 sed '5r /etc/resolv.conf' testfile2 10 11 sed '/root/{H;d};$G' /etc/passwd #將包含root的行剪下到末尾,H表示複製到剪下板,G表示貼上到指定行後 12 13 sed '1,2H;3,4G' /etc/passwd #將1、2行復制到3和4行的下面 14 15 echo "111222333" | sed 's/(111)(222)/2\1/' -r #將字元111和222互換位置 16 echo "111222333" | sed 's/^(.) (.*) (.)$/\3\2\1/' -r #將第一個字元和最後- -個字元互換