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