標籤:

Linux三劍客老二sed

我才不要手動改配置。——編程三分鐘

概述

sed命令是用來批量修改文本內容的,比如批量替換配置中的某個ip。

sed命令在處理時,會先讀取一行,把當前處理的行存儲在臨時緩衝區中,處理完緩衝區中的內容後,列印到屏幕上。然後再讀入下一行,執行下一個循環。不斷的重複,直到文件末尾。

語法:

sed [參數] [文本或文件]

由於不加-i參數只會輸出到控制台不會寫入到文件中,所以以下例子默認加-i

插入

  1. 在某行前面插入一行

$ sed -i "1a insert after" file.txt
$ cat file.txt
1
insert after
2
3

其中1a表示在第1行後(after)插入

  1. 在某行後面插入一行

$ sed -i "1i insert before" file.txt
$ cat file.txt
insert before
1
2
3

其中1i表示在第1行前插入

刪除

$ sed -i 2,3d file.txt
$ cat file.txt
1

刪除行可以刪除一行 (3d刪除第三行),也可以寫一個範圍(2,3d刪除2-3行,閉區間),$符號代表末尾

缺點是只能多次連續刪除行,不能一次性刪除匹配到的行,可以用正則刪除(/^2/d代表刪除所有內容以2開頭的行)

替換行

$ sed -i 2c replace file.txt
$ cat file.txt
1
replace
3

2c replace表示替換第2行的內容為replace

缺點是只能多次替換行,不能一次性替換全部匹配到的行,可以用正則替換(/^2/c replace代表替換所有以2開頭的行為replace

僅替換匹配的字元串

為了便於演示修改文件內容為

$ cat -n config.txt
1 name=coding3min
2 age=0
3 email=coding3min@foxmail.com
4 name=coding3min
5 age=0
6 email=coding3min@foxmail.com

使用命令批量替換3-4行之間coding3min字元串為tom

$ sed -i 3,4s/coding3min/tom/g config.txt
$ config.txt
name=coding3min
age=0
email=tom@foxmail.com
name=tom
age=0
email=coding3min@foxmail.com

s/coding3min/top/g代表全文匹配不限制行,去掉g代表只替換匹配到的第一個如s/coding3min/top

查找與輸出

輸出3-4行的內容

sed -n 3,4p config.txt
email=coding3min@foxmail.com
name=coding3min

查找所有以name開頭的行

sed -n /^name/p config.txt
name=coding3min
name=coding3min

可以看到只要用-n參數+匹配p模式就可以sj查找並輸出

自動創建備份文件

當然了,直接sed -i很容易造成替換錯誤,哭都沒辦法哭!所以需要事先用-n+p也就是上一節說的方法先校驗下結果。但是每個都校驗顯然是不實際的。所以可以用 sed -i備份文件後綴的方式例如sed -i.bak或者sed -i.backup

$ sed -i.bak s/coding3min/kitty/g config.txt
$ ls
config.txt config.txt.bak
$ cat config.txt
name=kitty
age=0
email=kitty@foxmail.com
$ cat config.txt.bak
name=coding3min
age=0
email=coding3min@foxmail.com

與grep的結合使用

grep結合使用最爽的點就在可以提前校驗和批量替換,提高容錯率和效率,不會的趕緊Get了

sed -i s/coding/kitty/g `grep -rl coding *`
$cat config.txt
name=conding3min
age=0
email=conding3min@foxmail.com
$cat test/config.txt
name=conding3min
age=0
email=conding3min@foxmail.com

看明白了嗎?上一節說的grep -rl遞歸找到匹配的文件,並把文件名輸出,前後加上了 ` 反引號,就是鍵盤左上角數字1左邊那個符號,代碼提前執行。

然後再使用替換文件內容。

其他技巧

使用sed把DOS格式的文件轉換為Unix格式 sed s/.$// filename

匹配所有包含郵箱的行,(-n 選項讓sed僅僅是輸出經過處理之後的那些行)

sed -n /[A-Za-z0-9]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)/p config.txt

email=coding3min@foxmail.com

email=coding3min@foxmail.com

去掉所有的html標籤

$ cat html.txt

<b>hi!</b><span>Im</span>

$ sed s/<[^>]*>//g html.txt

hi!Im father

推薦閱讀

(點擊標題可跳轉閱讀)

linux三劍客之老三grep

我的伺服器怎麼老這麼慢,難道說是被挖礦了?linux開機啟動項自查

我偷偷挖了一條網路隧道,差點被公司激活

如果有幫助別忘了分享給朋友哦~


推薦閱讀:

CentOS 7更新YUM源步驟
為什麼我喜歡樹莓派
版本控制系統
Linux閱碼場原創精華文章匯總
零基礎轉行Linux雲計算運維工程師獲得20萬年薪的超級學習技巧

TAG:Linux |