sed是Linux中用來處理文件的非交互式(和vim編輯器不一樣)指令,他可以把獲取的文件內容按照一定的要求過濾並且輸出過濾後的結果到文件
主要作用是在輸出內容時查找、新增、刪除和修改替換
命令行常用的sed指令的結構:
- -i 表示直接在源文件中進行修改
- -n 表示只顯示過濾後的內容
- -e 表示多重編輯,經常多個連續使用後面跟指令表示連續的處理動作
sed -[i/n/e] '<commands>' target_name
在文件中調用另一個包含sed指令的文件來使用sed指令時:
sed -[i/n/e] -f file target_name # file文件中記錄了指令
連續使用多個sed命令時,可以使用分號從中間隔開 ;
sed '/root/p';sed 's/word$/aaa/g'
- sed命令和選項:
a\ 在當前行後添加一行或多行
c\ 用新文本替換當前行中的文本
d 刪除行
i\ 在當前行之前插入文本
h 把模式空間的內容複製到暫存緩衝區
H 把模式空間的內容添加到緩衝區
g 取出暫存緩衝區的內容,將其複製到模式緩衝區
G 取出暫存緩衝區的內容,將其追加到模式緩衝區
l 列出非打印字符
p 打印行
n 讀入下一行輸入,並從下一條而不是第一條命令對其處理
q 結束或退出sed
r 從文件中讀取輸入行
! 對所選行以外的行應用所有命令
s 用一個字符串替換另外一個字符串 - 替換標誌:
g 在行內進行全局替換
p 打印行
w 將行寫入文件
x 交換暫存緩衝區和模式空間的內容
y 將字符轉換成另外一個字符
查找用法
- 根據關鍵詞查找
ifconfig | sed -n '/key/p'
查找包含"key"的行,並且輸出結果,p這個控制符表示顯示輸出
- 查找某一範圍的多行
輸出m到n行中的內容,p代表輸出,經常和 -n 一起使用
-n 的含義是不顯示原文內容,只顯示過濾後的內容
sed -n 'm,np'
sed -n 'm,$p' # 過濾m行開始到結束的內容
使用舉例:
ifconfig | grep inet | sed -n '1,2p'
輸出:
inet 172.16.255.144 netmask 255.255.240.0 broadcast 172.16.255.255
inet 127.0.0.1 netmask 255.0.0.0
- 打印某一符合模式的行到某一符合模式的行之間的多行
sed -n '/abc/,/def/p' file # 打印包含abc的行到def的行之間的多行
sed -n '2/,/def/p' file # 打印第二行到包含def的行之間的多行
新增內容用法
- 在某行後面新增內容
在第5行後面增加一行,內容爲string,a表示append即追加到尾部的含義
sed '5 a string' file
- 注意:這裏新增的行是另起一行
- 在符合某模式的行後面新增內容
在包含abc的行後面增加一行,內容爲def,a\表示追加,g表示對所有行都生效
sed '/abc/a\def/g' file
- 在某行前面新增內容
在第2行前面增加一行,內容爲string\nstring1,i表示insert即插入的含義
sed '2 i string\nstring1' file
- 在符合某模式的行前面新增內容
sed '/abc/i\def/g' file
刪除用法
- 刪除某一行
sed '2 d' file # 刪除第2行
sed '$ d' file # 刪除最後一行
- 刪除某包含模式的行
刪除包含abc的行
sed '/abc/d' file
- 刪除某一範圍的行
sed '1,3 d' file # 刪除1-3行
sed '/abc/,/def/d' file # 刪除包含abc的行至包含def的行之間的內容
替換用法
替換用法的基本格式:
regex是正則表達式用來匹配內容,replacement是將匹配到的內容替換的內容,flags是控制符
sed -n 's/regex/replacement/flags' file
- 將內容替換爲指定的內容
將所有的abc替換爲admin,g代表對所有匹配到的內容都生效
sed -n 's/abc/admin/g' file
- 將內容替換爲修改後的內容
將所有abc替換爲abcdef,&用來引用匹配到的內容
sed -n 's/abc/&def/gp' file
- 更改s後的分隔符
跟在s後面的符號就是分隔符,下面使用的是#作爲分隔符
sed -n 's#abc#def#gp' file
- 數據行的替換
將文本中某一行的內容替換爲指定的內容
例如:將第二行的內容替換爲string,c表示替換操作
sed '2 c string' file
其他用法
- 多重編輯 -e
使用-e來連接多個指令操作,先刪除第1,2行,然後把所有abc替換爲def
sed -e '1,2d' -e 's/abc/def/g' file
-e的另一種用法是直接跟一個多行指令,使用分號隔開
sed -e '1,2d;s/abc/def/g' file
- 文件操作
sed '/abc/r filename' file # 在包含abc的行後加入filename文件中的內容
sed '/abc/w filename' file # 在filename文件中寫入包含abc的行
- 讀取下一行
對符合條件的下一行進行操作
將包含abc的行的下一行中的123替換爲def
sed '/abc/{n; s/123/def/}' file