一. sed是一種逐行處理的流編輯器,在文本處理中非常有用。在shell等腳本文件中,可以使用sed來對文件進行替換編輯等操作。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲『模式空間』(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。sed主要用來自動編輯一個或多個文件,簡化對文件的反覆操作,編寫轉換程序等
二. 參數說明
- a :追加, a 的後面可以接字串,而這些字串會在當前行的下一行
- c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行
- d :刪除,因爲是刪除,所以 d 後面通常不加任何內容
- i :插入, i 的後面可以接字串,而這些字串會在當前行的上一行(取代當前行的行號)
- p :打印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行
- s :替換,對字符串進行處理,通常這個 s 的動作可以搭配正規表達式,例如 1,20s/old/new/g
三. 操作實例
1. 'p' 打印,打印通常與-n選項連用,屏蔽默認輸出,只顯示匹配內容
打印第1行
sed -n '1p' /etc/passwd
打印1到10行
sed -n '1,10p' /etc/passwd
打印倒數第一行
sed -n '$p' /etc/passwd
打印包含'root'的行
sed -n '/root/p' /etc/passwd
打印奇數行
sed -n '1~2p' /etc/passwd //從第一行開始,步長爲2
打印偶數行
sed -n '2~2p' /etc/passwd //從第二行開始,步長也爲2
2. 'd' 刪除
刪除包含'root'的行
sed '/root/d' /etc/passwd
刪除第10行
sed '10d' /etc/passwd
刪除最後一行
sed '$d' /etc/passwd
刪除5到10行
sed '5,10d' /etcp/passwd
刪除第5行和第10行
sed '5d;10d' /etc/passwd
3.'a' 追加
將'this a test line '追加到以root開頭的行後
sed '/^root/a\this a test line' /etc/passwd
將'this a test line'追加到第5行後
sed '5a\this a test line' /etc/passwd
4. 'i'插入
將'this a test line'插入到以root開頭的行前
sed '/^root/i\this a test line ' /etc/passwd
將'this a test line ' 插入到第5行前
sed '5i\this a test line ' /etc/passwd
5. 'c' 取代,c修改一整行,s僅修改某個關鍵詞
將包含root的行替換爲xxx
sed '/root/c\xxx' /etc/passwd
將第5到10行取代爲'this a test line'
sed '5,10c\this a test line' /etc/passwd
6. 's'替換,加 '-i' 選項會直接修改原文件
sed -n 's/ / /p' file 搭配用顯示替換的那一行
sed的/ / /可以替換爲任意符號,如:sed -n 's# # #p' file
將文件中每一行的第一個bash替換爲BASH
sed 's/bash/BASH/' /etc/passwd
將文件中每一行的第二個bash替換爲BASH
sed 's/bash/BASH/2' /etc/passwd
將文件中所有的bash替換爲BASH,加參數 ‘g’
sed 's/bash/BASH/g' /etc/passwd
將文件中包含www那一行所有的1001替換爲1002
sed '/www/s/1001/1002/g' /etc/passwd
將文件中第10行的'bin'替換爲'BIN'
sed '10s/bin/BIN/' /etc/passwd
將文件中第1到10行中所有的'bin'替換爲'BIN'
sed '1,10s/bin/BIN/g' /etc/passwd
將文件中最後一行的'bin'替換爲'BIN'
sed '$s/bin/BIN' /etc/passwd
在每行的行尾添加xxx
sed 's/$/ xxx' /etc/passwd
將passwd文件中倒數第10行中'bin'替換爲'BIN'
tac /etc/passwd | sed '10s/bin/BIN/' | tac