「 我纔不要手動改配置。——編程三分鐘」html
sed命令是用來批量修改文本內容的,好比批量替換配置中的某個ip。
sed命令在處理時,會先讀取一行,把當前處理的行存儲在臨時緩衝區中,處理完緩衝區中的內容後,打印到屏幕上。而後再讀入下一行,執行下一個循環。不斷的重複,直到文件末尾。
語法:linux
sed [參數] [文本或文件]
複製代碼
因爲不加-i
參數只會輸出到控制檯不會寫入到文件中,因此如下例子默認加-i
編程
$ sed -i "1a insert after" file.txt
$ cat file.txt
1
insert after
2
3
複製代碼
其中1a
表示在第1行後(after)插入bash
$ 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
)ui
爲了便於演示修改文件內容爲spa
$ 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
3d
$ 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
code
輸出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
結合使用最爽的點就在能夠提早校驗和批量替換,提升容錯率和效率,不會的趕忙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>I'm</span> $ sed 's/<[^>]*>//g' html.txt hi!I'm father複製代碼
(點擊標題可跳轉閱讀)
個人服務器怎麼老這麼慢,難道說是被挖礦了?linux開機啓動項自查
若是有幫助別忘了分享給朋友哦~