Shell文本處理三劍客之——sed編輯器

1、sed編輯器

■ sed是一種流編輯器,流編輯器會在編輯器處理數據以前基於預先提供的—組規則來編輯數據流正則表達式

■ sed編輯器能夠根據命令來處理數據流中的數據,這些命令要麼從命令行中輸入,要麼存儲在一個命令文本文件中express

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

  • 讀取: sed從輸入流(文件、管道、標準輸入)中讀取一行內容並存儲到臨時的緩衝區中(又稱模式空間,pattern space )bash

  • 執行: 默認狀況下,全部的sed命令都在模式空間中順序地執行,除非指定了行的地址,不然sed命令將會在全部的行上依次執行編輯器

  • 顯示: 發送修改後的內容到輸出流。在發送數據後,模式空間將會被清空。在全部的文件內容都被處理完成以前,上述過程將重複執行,直至全部內容被處理完ide

在全部的文件內容都被處理完成以前,上述過程將重複執行,直至全部內容被處理完ui

注意:默認狀況下全部的sed命令都是在模式空間內執行的,所以輸入的文件並不會發生任何變化,除非是用重定向存儲輸出spa

二、命令格式:

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

 

三、經常使用選項:

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

 

2、打印內容
sed -n- e 'p' testfile1
sed -n -e '=' testfile1
sed -n -e 'l' testfile1
sed--n -e '=;p' testfile1
sed -n -e '=' -e 'p' testfile1

sed -n '
> =
> p
> ' testfile1

 

image

image

image

image

image

image

3、使用地址

sed編輯器有2種尋址方式:命令行

  • 以數字形式表示行區間3d

  • 用文本模式來過濾出行code

sed -n '1p' testfile1

sed -n '$p' testfile1

sed -n '1, 3p' testfile1

sed -n '3, $p' testfilel

sed -n '1, +3p' testfilel   #打印1以後的連續3行,即1-4行

sed '5q' testfile1         #打印前5行信息後退出,q表示退出

sed -n 'p;n' testfile1     #打印奇數行; n表示移動到下一行

sed -n 'n;p' testfile1     #打印偶數行

sed -n '2,${n;p}' testfile1

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表示支持擴展正則表達式

 

以數字形式表示行區間

image

image

image

image

用文本模式來過濾出行

image

image

image

image

image

image

image

4、刪除行
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

 

image

image

image

image

5、替換

行範圍 s/舊字符串/新字符串/替換標記

4種替換標記:

  • 數字: 代表新字符串將替換第幾處匹配的地方

  • g: 代表新字符串將會替換全部匹配的地方

  • P: 打印與替換命令匹配的行,與-n一塊兒使用

  • w文件: 將替換的結果寫到文件中

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\/csh/p' /etc/passwd
sed -n 's! /bin/bash! /bin/csh!p' /etc/passwd     #使用「!」做爲字符串分隔符
sed -i 's9\945\9\99\98\939g' test.txt    #將94599替換爲9893

 

sed -n 's/ root/ admin/p' /etc/passwd

sed -n 's/ root/ admin/2p' /etc/passwd

 

image

image

image

image

image

image
image

image

image

image

image

image

image

image

image

image

image

image

6、插入
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      #將一、2行復制到3和4行的下面

echo  "111222333" | sed 's/(111)(222)/2\1/' -r #將字符111和222互換位置
echo "111222333" | sed 's/^(.) (.*) (.)$/\3\2\1/' -r   #將第一個字符和最後一個字符互換

 

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

相關文章
相關標籤/搜索