Linux三劍客老二sed
「 我才不要手動改配置。——編程三分鐘」
概述
sed命令是用來批量修改文本內容的,比如批量替換配置中的某個ip。
sed命令在處理時,會先讀取一行,把當前處理的行存儲在臨時緩衝區中,處理完緩衝區中的內容後,列印到屏幕上。然後再讀入下一行,執行下一個循環。不斷的重複,直到文件末尾。語法:
sed [參數] [文本或文件]
由於不加-i
參數只會輸出到控制台不會寫入到文件中,所以以下例子默認加-i
插入
- 在某行前面插入一行
$ sed -i "1a insert after" file.txt
$ cat file.txt
1
insert after
2
3
其中1a
表示在第1行後(after)插入
- 在某行後面插入一行
$ 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 |