天天看點

Shell編輯器之sed編輯器

(目錄)

sed編輯器

一、sed概念

  • sed是一種流編輯器,流編輯器會在編輯器處理資料之前基于預先提供的一組規則來編輯資料流。
  • sed編輯器可以根據指令來處理資料流中的資料,這些指令要麼從指令行中輸入,要麼存儲在一個指令文本檔案中。

二、sed的工作流程

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

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

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

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

三、sed指令格式

指令格式:

格式一:
sed [選項] '操作' 檔案1 [檔案2] ...
格式二:
sed [選項] '選項{
操作1
操作2
...
}' 檔案1 [檔案2] ...
           
  • 常用選項:
-e 或--expression=:表示用指定指令來處理輸入的文本檔案,隻有一個操作指令時可省略,一般在執行多個操作指令使用
-f 或--file=:表示用指定的腳本檔案來處理輸入的文本檔案。
-h 或--help:顯示幫助。
-n、--quiet 或 silent:禁止sed編輯器輸出,但可以與p指令一起使用完成輸出。
-i:直接修改目标文本檔案。
           
  • 常用操作:
s:替換,替換指定字元。
d:删除,删除標明的行。
a:增加,在目前行下面增加一行指定内容。
i:插入,在標明行上面插入一行指定内容。
c:替換,将標明行替換為指定内容。
y:字元轉換,轉換前後的字元長度必須相同。
p:列印,如果同時指定行,表示列印指定行;如果不指定行,則表示列印所有内容;如果有非列印字元,則以 ASCII 碼輸出。其通常與“-n”選項一起使用。
=:列印行号。
l(小寫L):列印資料流中的文本和不可列印的ASCII字元(比如結束符$、制表符\t)
           

四、使用sed指令

1、列印内容

sed -n 'p' sed.txt
           
Shell編輯器之sed編輯器
sed '=' sed.txt
sed -n '=' sed.txt
這裡 = 兩邊可以不加''
           
Shell編輯器之sed編輯器
sed -n 'l' sed.txt
           
Shell編輯器之sed編輯器
sed -n '=;p' sed.txt
sed -n -e '=' -e 'p' sed.txt
           
Shell編輯器之sed編輯器
#方式2的變種,在輸出“'”後直接回車,然後在“>”前輸出操作,最後以“ ' 檔案”結尾
sed -n '
> =
> p
> ' sed.txt
           
Shell編輯器之sed編輯器

2、使用位址

  • sed編輯器有2種尋址方式:

    1、以數字形式表示行區間

    2、用文本模式來過濾出行

#列印第一行
sed -n '1p' sed.txt 
           
Shell編輯器之sed編輯器
#列印最後一行
sed -n '$p' sed.txt
           
Shell編輯器之sed編輯器
#列印1到3行
sed -n '1,3p' sed.txt
           
Shell編輯器之sed編輯器
#列印3到最後一行
sed -n '3,$p' sed.txt
           
Shell編輯器之sed編輯器
#列印1之後的連續3行,即1-4行
sed -n '1,+3p' sed.txt
           
Shell編輯器之sed編輯器
#輸出前5行資訊後退出,q表示退出
sed '5q' sed.txt
           
Shell編輯器之sed編輯器
#列印奇數行
#第一步:sed讀取第一行,p列印出來
#第二步:這裡n表示移動到下一行(此時是第二行)
#第三步:sed指令結束,再次切換到下一行(此時是第三行)
#第四步:重複一二三的步驟,直至最後一行
sed -n 'p;n' sed.txt
#列印偶數行,和上面的步驟差不多
sed -n 'n;p' sed.txt
           
Shell編輯器之sed編輯器
#從第2行開始執行n和p的操作,也是奇數行
sed -n '2,${n;p}' sed.txt
           
Shell編輯器之sed編輯器
#在/etc/passwd檔案中過濾出含有root的行,并列印出來,注意大小寫
sed -n '/root/p' /etc/passwd
           
Shell編輯器之sed編輯器
#從/etc/passwd檔案中列印以‘r’開頭的行,注意大小寫
sed -n '/^r'/p  /etc/passwd
           
Shell編輯器之sed編輯器
#從/etc/passwd檔案中列印以‘bash’結尾的行,注意大小寫
sed -n '/bash$'/p  /etc/passwd
           
Shell編輯器之sed編輯器
#列印檔案裡包含ftp和root的行
sed -n '/ftp\|root/p' /etc/passwd
           
Shell編輯器之sed編輯器
#從第二行開始列印到包含nobody的行
sed -n '2,/nobody/p' /etc/passwd
           
Shell編輯器之sed編輯器
#-r表示支援正規表達式
sed -nr '/ro{1,}t/p' /etc/passwd
           
Shell編輯器之sed編輯器

3、删除行

#全删
sed 'd' sed.txt
           
Shell編輯器之sed編輯器
#删除第三行
sed '3d' sed.txt
           
Shell編輯器之sed編輯器
#删除2到4行
sed '2,4d' sed.txt
           
Shell編輯器之sed編輯器
#删除最後一行
sed '$d' sed.txt
           
Shell編輯器之sed編輯器
#删除空行
sed '/^$/d' sed.txt
           
Shell編輯器之sed編輯器
#删除以e結尾的行
sed '/e$/d' sed.txt
           
Shell編輯器之sed編輯器
#除了e結尾的都删了,“!”表示取反操作
sed '/e$/!d' sed.txt
           
Shell編輯器之sed編輯器
#從第一個位置打開行删除功能,到第二個位置關閉行删除功能,按行删除(慎用)
sed '/1/,/c/d' sed.txt
           
Shell編輯器之sed編輯器

4、替換

格式:
sed [選項] '行範圍 s/舊字元串/新字元串/替換标記'

4種替換标記:
數字:表明新字元串将替換第幾處比對的地方
g:表明新字元串将會替換所有比對的地方
p:列印與替換指令比對的行,與-n一起使用
w 檔案:将替換的結果寫到檔案中
           
Shell編輯器之sed編輯器
#将每行的第一個root替換成admin
sed -n 's/root/admin/p' /etc/passwd
           
Shell編輯器之sed編輯器
#将每行的第二個root替換成admin
sed -n 's/root/admin/2p' /etc/passwd
           
Shell編輯器之sed編輯器
#将每行的所有root替換成admin
sed -n 's/root/admin/gp' /etc/passwd
#将每行的所有root删除
sed 's/root//g' /etc/passwd
           
Shell編輯器之sed編輯器
#1-20行行首添加#号
sed '1,20 s/^/#/' /etc/passwd
           
Shell編輯器之sed編輯器
#在以root開頭的行的結尾添加#号
sed '/^root/ s/$/#/' /etc/passwd
           
Shell編輯器之sed編輯器
vim script.sed      #建立一個用于sed指令的腳本,以sed結尾友善辨識           
s/1/11/             #将1替換成11,下面以此類推
s/a/zb/
s/555/888/
sed -f script.sed sed.txt
           
Shell編輯器之sed編輯器
#将/etc/passwd中的1-20行輸出儲存到out.txt檔案中
sed -n '1,5w out.txt' /etc/passwd
#将/etc/passwd 中的1-20行的開頭添加#後儲存到out.txt檔案中
sed -n '1,20 s/^/#/w out1.txt' /etc/passwd
           
#将/bin/bash替換成/bin/csh
sed -n 's/\/bin\/bash/\/bin\/csh/p' /etc/passwd #“\”是轉義字元,用來取消“/”的特殊意義
sed -n 's!/bin/bash!/bin/csh!p' /etc/passwd		#使用“!”作為字元串分隔符