天天看點

Linux三劍客-----sed一、sed編輯器二、sed指令總結

sed

  • 一、sed編輯器
  • 二、sed指令
    • 1.格式
    • 2.常用選項
    • 3.常用操作
    • 4.執行
      • 1.列印内容
      • 2.尋址方式
      • 3.删除
      • 4.替換
      • 5.插入
  • 總結

一、sed編輯器

sed是一種流編輯器,流編輯器會在編輯器處理資料之前基于預先提供的一組規則來編輯資料流。

sed編輯器可以根據指令來處理資料流中的資料,這些指令要麼從指令行中輸入,要麼存儲在一個指令文本檔案中。

sed的工作流程主要包括讀取、執行和顯示三個過程

操作順序 說明
讀取 sed從輸入流(檔案、管道、标準輸入)中讀取一行内容并存儲到臨時的緩沖區中(又稱模式空間,patternspace)
執行 預設情況下,所有的sed指令都在模式空間中順序地執行,除非指定了行的位址,否則sed指令将會在所有的行上依次執行
顯示 發送修改後的内容到輸出流。在發送資料後,模式空間将會被清空。在所有的檔案内容都被處理完成之前,上述過程将重複執行直至所有内容被處理完。

在所有的檔案内容都被處理完成之前,.上述過程将重複執行,直至所有内容被處理完。

注意:預設情況下所有的sed指令都是在模式空間内執行的,是以輸入的檔案并不會發生任何變化,除非是用重定向存儲輸出。

二、sed指令

1.格式

指令格式

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 ...
           

2.常用選項

選項 說明
-e 表示用指定指令來處理輸入的文本檔案,隻有一個操作指令時可省略,一般在執行多個操作指令使用
-f 表示用指定的腳本檔案來處理輸入的文本檔案
-h 顯示幫助
-n、- -quiet 或者 silent 禁止sed編輯器輸出,但可以與p指令一起使用完成輸出
-i 直接修改目标文本檔案

3.常用操作

選項 說明
s 替換,替換指定字元
d 删除,删除標明的行
a 增加,在目前行下面增加一行2指定内容
i 插入,在標明行上面插入一行指定内容
c 替換,将標明行替換指定内容
y 字元轉換,轉換前後的字元長度必須相同
p 列印,如果同時指定行,表示列印指定行;如果不指定行,則表示列印所有内容;如果有非列印字元,則以ASCII碼輸出。共通常與“-n”選項一起使用。
= 列印行号
l(小寫L) 列印資料流中的文本和不可列印的ASCII字元( 比如結束符$、制表符\t)
r 讀取指定檔案
w 儲存為檔案

4.執行

1.列印内容

[[email protected] sed]# sed -n -e 'p' 1.txt
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
[[email protected] sed]# sed '=' 1.txt

[[email protected] sed]# sed -n -e '=' 1.txt
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
[[email protected] sed]# sed -n -e 'l' 1.txt
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
=;p 先顯示行号然後顯示内容
[[email protected] sed]# sed -n -e '=;p' 1.txt
[[email protected] sed]# sed -n -e '=' -e 'p' 1.txt
[[email protected] sed]# sed -n '
> =
> p
> ' 1.txt

p;= 先顯示内容然後顯示行号
[[email protected] sed]# sed -n -e 'p;=' 1.txt
[[email protected] sed]# sed -n -e 'p' -e '=' 1.txt
[[email protected] sed]# sed -n '
> p
> =
> ' 1.txt
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
Linux三劍客-----sed一、sed編輯器二、sed指令總結
Linux三劍客-----sed一、sed編輯器二、sed指令總結

2.尋址方式

顯示第n行
[[email protected] sed]# sed -n 'np' 1.txt

顯示第一行
[[email protected] sed]# sed -n '1p' 1.txt

顯示最後一行
[[email protected] sed]# sed -n '$p' 1.txt
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
顯示2到尾行
[[email protected] sed]# sed -n '2,$p' 1.txt

顯示第n到第m行
[[email protected] sed]# sed -n 'n,mp' 1.txt
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
顯示第2行及以後3行
[[email protected] sed]# sed -n '2,+3p' 1.txt

顯示第n行及以後m行
[[email protected] sed]# sed -n 'n,+mp' 1.txt
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
顯示到第n行後退出
[[email protected] sed]# sed 'nq' 1.txt

顯示到第4行後退出
[[email protected] sed]# sed '4q' 1.txt
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
列印奇數行
[[email protected] sed]# sed -n 'p;n' 1.txt
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
列印偶數行
[[email protected] sed]# sed -n 'n;p' 1.txt
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
[[email protected] sed]# sed -n '2,${n;p}' 1.txt
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
顯示比對/user/的行
[[email protected] sed]# sed -n '/user/p' /etc/passwd

顯示比對以a開頭的行
[[email protected] sed]# sed -n '/^a/p' /etc/passwd

顯示比對以bash結尾的行
[[email protected] sed]# sed -n '/bash$/p' /etc/passwd
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
顯示有ftp或root的行
[[email protected] sed]# sed -n '/ftp\|root/p' /etc/passwd
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
顯示從第二行開始到111aaa的行
[[email protected] sed]# sed -n '2,/111aaa/p' /etc/passwd

顯示從第二行開始到111aaa的行的行号
[[email protected] sed]# sed -n '2,/111aaa/=' /etc/passwd
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
顯示從ro(比對o一次及以上)t的行  -r表示支援擴充正規表達式
[[email protected] sed]# sed -nr '/ro{1,}t/p' /etc/passwd
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結

3.删除

删除所有
[[email protected] sed]# sed 'd' 1.txt

删除第n行
[[email protected] sed]# sed 'nd' 1.txt

删除第n行到第m行
[[email protected] sed]# sed 'n,md' 1.txt

删除最後一行
[[email protected] sed]# sed '$d' 1.txt

删除空行
[[email protected] sed]# sed '/^$/d' 1.txt

删除以bash結尾的行
[[email protected] sed]# sed '/bash$/d' 1.txt

删除除了bash結尾的行
[[email protected] sed]# sed '/bash$/!d' 1.txt

從第一個位置打開行删除功能,到第二個位置關閉行删除功能 沒有第二個位置 會從第一個位置删到結尾
[[email protected] sed]# sed '/2/,/3/d' 1.txt
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結

4.替換

行範圍 s/舊字元串/新字元串/替換标記
           

4種替換标記:

選項 說明
數字 表明新字元申将替換第幾處比對的地方
g 表明新字元串将會替換所有比對的地方
p 列印與替換指令比對的行,與-n一起使用
w 檔案 将替換的結果寫到檔案中
替換比對到每行第一個root換成admin
[[email protected] sed]# sed -n 's/root/admin/p' /etc/passwd

替換比對到每行第二個root換成admin
[[email protected] sed]# sed -n 's/root/admin/2p' /etc/passwd

替換比對到所有root換成admin
[[email protected] sed]# sed -n 's/root/admin/gp' /etc/passwd

删除比對到所有root
[[email protected] sed]# sed -n 's/root//gp' /etc/passwd

第1到20行 行首加#
[[email protected] sed]# sed -n '1,20 s/^/#/' /etc/passwd

比對到root開頭的行尾加#
[[email protected] sed]# sed -n '/^root/ s/$/#/' /etc/passwd

sed調用res.sed文本中的指令對/etc/passwd檔案進行操作
[[email protected] sed]# sed -f res.sed /etc/passwd

将/etc/passwd 1到20行内容輸入到 abc.txt檔案中
[[email protected] sed]# sed '1,20w abc.txt' /etc/passwd

将/etc/passwd 1到20行行首加上#并輸入到 abc.txt檔案中
[[email protected] sed]# sed '1,20w s/^/#/w abc.txt' /etc/passwd
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
将/etc/passwd中 /bin/bash替換成/bin/csh
[[email protected] sed]# sed -n 's/\/bin\/bash/\/bin\/csh/p' /etc/passwd

将/etc/passwd中 /bin/bash替換成/bin/csh  !作為字元串分隔符
sed -n 's!/bin/bash! /bin/csh!p' /etc/passwd

将94599替換成9893   9為字元串分隔符
sed -i 's9\945\9\99\98\939g' abc.txt
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結

5.插入

将比對到45的行換成ABC
[[email protected] sed]# sed '/45/c ABC' abc.txt

将45換成AB 前後替換的位數一樣
[[email protected] sed]# sed '/45/ y/45/AB/' abc.txt

1到3行之下插入ABC
[[email protected] sed]# sed '1,3a ABC' abc.txt

首行插入ABC
[[email protected] sed]# sed '1i ABC' abc.txt

為行插入ABC
[[email protected] sed]# sed '$a ABC' abc.txt

在1.txt文本第5行後插入/etc/resolv.conf内容
[[email protected] sed]# sed '5r /etc/resolv.conf' 1.txt

将包含root的行剪切到末尾,H表示複制到剪切闆,G表示粘貼到指定行後
[[email protected] sed]# sed '/root/{H;d};$G' /etc/passwd

将1、2行複制到3和4行的下面
[[email protected] sed]# sed '1,2H;3,4G' /etc/passwd
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結
将字元123和ABC互換位置
[[email protected] sed]# echo "123ABC" | sed 's/(123)(ABC)/\2\1/'

将第一位和最後一位互換位置
[[email protected] sed]# echo "123ABC" | sed 's/^(.)(.*)(.)$/\3\2\1/'

位置颠倒
[[email protected] sed]# echo "123ABC" | sed -r 's/^(.)(.*)(.)$/\3\2\1/' | sed -r 's/^(.)(.)(.*)(.)(.)$/\1\4\3\2\5/' | sed -r 's/^(.{2})(.)(.)(.{2})$/\1\3\2\4/'
           
Linux三劍客-----sed一、sed編輯器二、sed指令總結

總結

流式編輯器 又稱行編輯器,每次隻編輯一行。Sed工作是在“模式空間”中進行的,并不操作源檔案。對源檔案無危害。

sed格式

sed常用選項

sed常用操作

sed列印内容

sed尋址方式

sed删除

sed替換

sed插入

繼續閱讀