sed
目錄
一 sed 編輯器1.1sed的工作流程
二:sed 指令使用
2.1 格式
2.2 常用選項
2.3 常用操作
2.4 示例
三:sed 的 尋址方式
3.1 數字形式表示區間3.1.1 sed 的步長
3.2 用文本模式來過濾出行
3.2.1 正則比對
3.2.2 sed 的打開與關閉
3.3 sed 的 n 讀取下一行,及q 退出
3.3.1 n操作,讀取下一行
3.3.2 q 退出操作
四: sed 的替換操作
4.1 格式
4.2 s 操作進行替換
4.3 sed與選項 -f 一起使用
4.4 sed 使用 c 操作 整行替換
4.5 sed 使用 y 進行替換
4.6 sed 的字元串分隔符
五 sed 的删除操作
六 插入
6.1 i 行前插入,a 行後插入,r 讀入文本
6.2 sed 剪切複制操作
7 使用sed 将字元串互換位置
7.1 将 111 和 222 互換位置
7.2 将第一個字元和最後一個字互換位置
7.3 将ip 位址反向輸出
sed 是一種流編輯器,流編輯器會在編輯器處理資料之前基于預先提供的一組規則來編輯資料流
sed 編輯器可以根據指令來處理資料流中的資料,這些指令要麼從指令行中輸入,要麼存在在一個指令檔案中
sed 的工作流程主要包括 讀取,執行 ,顯示, 三個過程
讀取:sed從輸入流(檔案,管道,标準輸入)中讀取一行内容并存儲到臨時的緩沖區中(又稱為模式空間)
執行:預設情況下,所有sed指令都在模式空間中順序地執行,除非指定了行的位址,否則sed指令将會在所有的行上依次執行
顯示:發送修改後的内容到輸出流。在發送該資料後,模式空間将會被清空。
在所有的檔案内容都被處理完之前,上述過程将重複執行,直到所有内容都被處理完
預設情況下所有的sed指令都是在模式空間内執行,是以輸入的檔案并不會發生任何變化,除非用重定向存儲輸出
sed 預設隻支援基礎正則
<code>sed -e '操作' 檔案1 檔案2 ...</code>
<code>sed -n -e '操作' 檔案1 檔案2 ....</code>
<code>sed -f 腳本檔案 檔案1 檔案2 ...</code>
<code>sed -i -e '操作' 檔案1 檔案2</code>
選項
釋義
-e 或者 --expression=
表示用指定指令來處理輸入的文本檔案,隻有一個操作指令時可以省略一般在執行多個操作指令使用
f 或者--file=
表示用指定的腳本檔案來處理輸入的文本檔案
h 或者 --help
顯示幫助
-n , --quit 或者silent
禁止sed 編輯器輸出。可以與p指令一起使用完成輸出
-r
讓sed 支援擴充正規表達式
-s
将輸入的檔案視為各個獨立的檔案,而不是一個長的連續輸入
-i
直接修改目标文本檔案
sed 的操作,如果不加 -i 選項,是不會改變檔案内容的
操作
s
替換,替換指定字元
d
删除,删除標明的行
a
增加,在目前行的下面增加一行指定内容
i
插入,在標明行的上面插入一行指定内容
c
替換,将標明行整行替換為指定内容
y
字元轉換,轉換前後的字元長度必須相同(不能對正規表達式使用)
p
答應,如果同時指定行,表示列印行。如果不指定行,則表示列印所有内容
=
列印行号
l(小寫L)
列印資料流中的文本和不可列印的ASCII 字元(如結束符$,制表符 \t)
n
讀取下一行内容
q
退出sed程式
!
取反
h
把模式空間裡的内容複制到暫存緩沖區
H
把模式空間裡的内容追加到暫存緩沖區
g
把暫存緩沖區裡的内容複制到模式空間,覆寫原有的内容
G
把暫存緩沖區的内容追加到模式空間裡,追加在原有内容的後面
w 檔案
将所選的行寫入檔案

以數字形式表示行區間
<code>sed -n '3p' testfile #列印第三行</code>
用文本模式來過濾出行
<code>sed -n '/a/p' testfile #列印包含a的行</code>
sed 可以用 1,2,3,4 .... 整數表示行。 "$" 可以表示最後一行。
如果想表示從多少行,到多少行, 可以寫出開始行和結尾行,中間以逗号"," 隔開.如:sed -n '1p,3p' testfile1 表示列印第一行到第三行
如; sed -n '1~2p' testfile , “1~2p” 表示 從第一行開始列印,步長是2,也就是列印奇數行
sed 可以将要比對的内容寫在斜線"/" 之間 如: sed -n '/a/p' testfile2 表示比對包含 a 的行并列印
sed 預設支援基礎正則。如果使用擴充正則,需要加上選項 -r
sed 先讀取了第 1 行,然後執行 了 p 列印操作,列印了第 1 行的内容
之後,再執行 n 操作,讀取下一行,也就是讀取第 2 行。但是因為後續沒有 p 列印操作,是以,第 2 行滅有列印
然後,sed 讀取第 3 行内容,執行 p 列印操作,列印 第 3 行内容
之後,再執行n 操作, 讀取下一行,也就是讀取第 4 行。但是,依舊因為沒有p 操作,無法列印出來
sed 先讀取第 1 行内容, 因為内有 p 操作,是以,第一行沒有列印。
再執行n 指令,讀取下一行 ,也就是讀取第2 行,之後再執行 p 指令,将第 2 行列印出來
sed 讀取 從第 5 行 到 最後一行。中間以 np 的 形式操作。
讀取 第 5 行 ,因為沒有 p 操作,是以不列印。然後執行 n操作 ,讀取下一行的,也就是讀取 第6 行。然後再執行 p 列印操作,列印第 6 行
然後 再讀取第 7 行,之後,不列印。執行 n 操作,讀取下一行,也就是讀取第 8 行。然後再執行 p列印操作,列印第8 行。
一直循環,一直到最後一行
sed 工作流程: 讀取,執行,列印。
當工作到第5行時,執行完列印的操作後,執行 q 退出操作。
也就是說,sed '5q' testfile1 指令,sed 隻讀取到第 5行 就終止了工作
行範圍 s/舊字元/新字元/替換标記 #字元替換
行範圍c 新字元 #整行替換
行範圍 y/舊字元串/新字元串 #舊字元串的長度要和新字元串長度一樣
替換标記
标記
數字
表明新字元串将替換地基礎比對的地方
表明新字元串将會替換所有比對的地方
列印與替換指令比對的行,與 -n 選項一起使用
w 檔案
将替換的結果寫到檔案中
先編寫支援sed 指令的腳本
執行sed 指令
選項 -f 後面加上支援sed的腳本檔案
<code>[root@host103 test]# sed -n -f 1.sed /etc/passwd</code>
sed 替換時,字元串的分隔符 不是必須為 "/" ,也可以為 “@”,“#” ,“1”,“2”,"a" ,"b" ... 隻要保持一緻即可
h/H 複制到剪切闆,g/G 黏貼到指定行
<code>s/()()/\2\1</code>
使用 ()括号,将模式空間内容整體分段複制到保留白間
再按照一定順序輸出到模式空間