Linux三劍客老二sed

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

概述

sed命令是用來批量修改文本內容的,好比批量替換配置中的某個ip。
sed命令在處理時,會先讀取一行,把當前處理的行存儲在臨時緩衝區中,處理完緩衝區中的內容後,打印到屏幕上。而後再讀入下一行,執行下一個循環。不斷的重複,直到文件末尾。
語法:linux

sed [參數] [文本或文件]
複製代碼

因爲不加-i參數只會輸出到控制檯不會寫入到文件中,因此如下例子默認加-i編程

插入

  1. 在某行前面插入一行
$ sed -i "1a insert after" file.txt
$ cat file.txt
1
insert after
2
3
複製代碼

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

  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開頭的行爲replaceui

僅替換匹配的字符串

爲了便於演示修改文件內容爲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字符串爲tom3d

$ 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/topcode

查找與輸出

輸出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>I'm</span> $ sed 's/<[^>]*>//g' html.txt hi!I'm father複製代碼

推薦閱讀

(點擊標題可跳轉閱讀)

linux三劍客之老三grep

個人服務器怎麼老這麼慢,難道說是被挖礦了?linux開機啓動項自查

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

若是有幫助別忘了分享給朋友哦~

相關文章
相關標籤/搜索