1. 程式人生 > >Sed文字編輯器

Sed文字編輯器

Sed文字處理工具原理與使用
sed 是一種線上編輯器,它一次處理一行內容。處理時,把當前處理的行儲存在臨時緩衝區中,稱為“模式空間”(pattern space),接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。接著處理下一行,這樣不斷重複,直到檔案末尾。檔案內容並沒有 改變,除非你使用重定向儲存輸出。Sed主要用來自動編輯一個或多個檔案;簡化對檔案的反覆操作;編寫轉換程式等。
sed命令格式
sed [選項] [動作]
選項與引數
-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的資料一般都會被列出到終端上。但如果加上 -n 引數後,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來。
-e :直接在命令列模式上進行 sed 的動作編輯;
-f :直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的 sed 動作;
-r :sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)
-i :直接修改讀取的檔案內容,而不是輸出到終端。
常用命令
a:新增行, a 的後面可以是字串,而這些字串會在新的一行出現(目前的下一行)
c:取代行,c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行
i:插入行, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
d :刪除行,因為是刪除,所以 d 後面通常不接任何引數,直接刪除地址表示的行;
p :列印,亦即將某個選擇的資料印出。通常 p 會與引數 sed -n 一起執行
s :替換,可以直接進行替換的工作,通常這個 s 的動作可以搭配正規表示法,例如 1,20s/old/new/g 一般是替換符合條件的字串而不是整行
(1)新增行
以/etc/passwd為例列出行號,在第二行後加上“hello,world”


如果想新增兩行以上,在第二行增加兩行,例如“hello,world”,“hello,linux”
(2) 刪除行
刪除1到10行
在這裡插入圖片描述
(3) 替換行
第一行替換為no number
在這裡插入圖片描述
1-5行替換為no number
在這裡插入圖片描述
(4)顯示行
顯示1到10行
在這裡插入圖片描述
顯示奇數行
在這裡插入圖片描述
1~2意思為從第一行開始,隔兩行列印
(5)資料的搜尋並刪除
刪除/etc/passwd所有包含root的行,其他行輸出
在這裡插入圖片描述
(6)資料的搜尋並執行
搜尋/etc/passwd,找到root對應的行,執行後面花括號中的一組命令,每個命令之間用分號分隔,這裡把bash替換為blueshell,再輸出這行:
在這裡插入圖片描述
(7)資料的搜尋並替換
在這裡插入圖片描述
從第四行可以看到s命令只替換了每行搜尋到的第一個aa,其他的aa並沒有被替換
如果想對全文的aa替換就可以使用g命令,g表示全域性替換
在這裡插入圖片描述

(8)資料的搜尋並輸出
p命令用於搜尋符合條件的行,並輸出該行,不做修改
在這裡插入圖片描述
可以看到第三行被輸出,但是檔案的全部內容都被輸出,而第三行多輸出一遍,sed預設情況是將檔案的全部內容輸出,如果需要指定哪一行要加上-n引數
在這裡插入圖片描述
(9)將修改應用到檔案中(危險動作)
之前所做是我操作都沒有修改檔案的內容,只是看到修改的結果輸出到控制檯,但是並沒有修改test.txt檔案,我們可以使用-i引數直接修改檔案內容
在這裡插入圖片描述
(10)把模式空間內容寫到檔案中
命令 w 可以把當前模式空間的內容儲存到檔案中。預設情況下模式空間的內容每次都會列印到標準輸出,如果要把輸出儲存到檔案同時不顯示到螢幕上,還需要使用-n 選項。
將test.txt檔案內容儲存到output.txt 並顯示在螢幕上
在這裡插入圖片描述

將test.txt檔案內容儲存到output.txt ,不在螢幕上顯示
在這裡插入圖片描述
只儲存第二行
在這裡插入圖片描述
sed的元字符集
^ 匹配行開始,如:/^sed/匹配所有以sed開頭的行;
$ 匹配行結束,如:/sed$/匹配所有以sed結尾的行;
. 匹配一個非換行符的任意字元,如:/s.d/匹配s後接一個任意字元,最後是d;
匹配0個或多個字元,如:/sed/匹配所有模板是一個或多個空格後緊跟sed的行;
[] 匹配一個指定範圍內的字元,如/[ss]ed/匹配sed和Sed;
[^] 匹配一個不在指定範圍內的字元,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行;
(…) 匹配子串,儲存匹配的字元,如s/(love)able/\1rs,loveable被替換成lovers;
& 儲存搜尋字元用來替換其他字元,如s/love/
& /,love這成love**;
< 匹配單詞的開始,如:/
> 匹配單詞的結束,如/love>/匹配包含以love結尾的單詞的行;
x{m} 重複字元x,m次,如:/0{5}/匹配包含5個0的行;
x{m,} 重複字元x,至少m次,如:/0{5,}/匹配至少有5個0的行;
x{m,n} 重複字元x,至少m次,不多於n次,如:/0{5,10}/匹配5~10個0的行;
Sed Practice!
/etc/passwd

  1. 刪除檔案每行的第一個字元
    sed 's/^.// /etc/passwd

  2. 刪除檔案每行的第二個字元
    sed ‘s/.//2’ /etc/passwd

  3. 刪除檔案每行的最後一個字元
    sed ‘s/.$//’ /etc/passwd

  4. 刪除檔案每行的倒數第二個字元
    sed ‘s/(.*)(.)(.)$//\1\3/’ /etc/passwd

  5. 刪除檔案每行的第二個單詞
    sed ‘s/(… * :\ )(… * :\ )(… * :\ )(… * :\ )(… * :\ )(… * :\ )(…*\ )/\1\3\4\5\6\7/g’ /etc/passwd

  6. 刪除檔案每行的倒數第二個單詞
    sed ‘s/(… * :\ )(…* :\ )(… * : \ )(… * :\ )(… * :\ )(… * :\ )(… * \ )/\1\2\3\4\5\7/g’ /etc/passwd

  7. 刪除檔案每行的最後一個單詞
    sed ‘s/(… * :\ )(… * :\ )(… * :\ )(… * :\ )(. * :\ )(… * :\ )(… * \ )/\1\2\3\4\5\6/g’ /etc/passwd

  8. 交換每行的第一個字元和第二個字元
    sed ‘s/(.)(.)(.*)$/\2\1\3/’ /etc/passwd

  9. 交換每行的第一個字元和第二個單詞

  10. 交換每行的第一個單詞和最後一個單詞
    sed ‘s/(… * :\ )(… * :\ )(… * :\ )(… * :\ )(. * :\ )(… * :\ )(… * \ )/\7\2\3\4\5\6\1/’ /etc/passwd

  11. 刪除一個檔案中所有的數字
    sed ‘s/[0-9]//g’ /etc/passwd

  12. 刪除每行開頭的所有空格
    sed -r ‘s/^ +//g’ /etc/passwd

  13. 用製表符替換檔案中出現的所有空格
    sed -r ‘s/ +/\t/g’ /etc/passwd

  14. 把所有大寫字母用括號()括起來
    sed ‘s/[A-Z]/(&)/g’ /etc/passwd

  15. 列印每行3次
    sed ‘p;p’ /etc/passwwd

  16. 隔行刪除
    sed ‘0~2d’ /etc/passwd

  17. 把檔案從第5行到第10行復制到第15行後面
    nl /etc/passwd | sed ‘5h;6,10H;15G’

  18. 把檔案從第5行到第10行移動到第15行後面
    nl /etc/passwd | sed ‘5h;6,10H;15G’ | sed ‘5,10d’

  19. 只顯示每行的第一個單詞
    sed ‘s/(. .:\ )(…:\ )(…:\ )(…:\ )(.:\ )(…:\ )(…*\ )/\1/’ /etc/passwd

  20. 列印每行的第一個單詞和第三個單詞
    sed -n ‘s/(…:\ )(…:\ )(…:\ )(…:\ )(…:\ )(…:\ )(…*)/\1\3/p’ /etc/passwd

  21. 將格式為 mm/yy/dd 的日期格式換成 mm;yy;dd
    date +%m/%y/%d |sed ‘s#/#; #g’