1. 程式人生 > 其它 >三劍客之 Sed 編輯器

三劍客之 Sed 編輯器

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   #將第一個字元和最後- -個字元互換