一、概念說明
官方概念說明:
stream editor for filtering and transforming text
字符流過濾編輯和文本字符流轉換工具
Linux sed 命令是利用腳本來處理文本文件。
sed 可依照腳本的指令來處理、編輯文本文件。
Sed 主要用來自動編輯一個或多個文件、簡化對文件的反復操作、編寫轉換程序等。
二、sed功能作用說明
-
處理文件信息
- 文本文件信息(小文件)
- 日志文件信息
- 配置文件信息
-
處理文件方式
- 增加信息
- 刪除信息
- 修改信息
- 查找信息
三、sed語法原理
3.1 命令語法格式
標准格式:
sed [選項] [sed指令] [文件信息]
sed [參數] '處理規則' [操作對象]
...
相關參數 | 參數說明 |
---|---|
-e | 允許多項編輯 |
-n | 取消默認輸出 |
-i | 就地編輯 |
-r | 支持拓展正則 |
-f | 指定sed匹配規則腳本 |
舉例說明:
sed -i 's#oldboy#oldgirl#g' oldboy.txt
命令參數: -i
命令指令: s
指令修飾: g
相同指令信息只能使用一次,想使用多次需要加上分號
sed四種定位模式如下:
1、數字定位法
eg:指定行號
sed '3d' [文件信息]
sed '2,3d' [文件信息]
2、正則定位法
eg:指定正則定位
sed '/^g/d' [文件信息]
3、數字和正則定位法
sed '3,/^g/d' [文件信息]
4、正則和正則定位法
sed '/^g/,/^j/d' [文件信息]
sed的編輯模式指令匯總如下:
d :刪除
p :打印
a : 在當前行后添加一行或多行
sed '2axxx' [文件信息]
c :用新文本修改(替換)當前行
sed '2cxxx' [文件信息]
i : 在當前行之前,插入文本(單獨使用時)
sed '2ixxx' [文件信息]
r : 在文件中讀內容
sed '2r r.txt' [文件信息]
w : 將指定行寫入文件
sed '2w w.txt' [文件信息]
y : 將字符轉換成另一個字符
sed '2y/fa/FA/' [文件信息]
s : 將字符串轉換成另一個字符串(每一行只替換一次)
sed 's/11/22/' [文件信息]
g : 全部執行
sed 's/11/22/g' [文件信息]
i : 忽略大小寫(跟 s 模式一起使用時)
& :代表前面匹配到的內容
3.2 命令執行過程
四、sed實踐操作
4.1 實踐環境搭建
cat >person.txt<<EOF
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
EOF
4.2 命令操作實踐
-
查詢實踐
-
單行查找
打印模式空間內容:p 取消默認輸出信息:-n
最終命令執行信息:
按照行號查找: sed -n '1p' person.txt 按照信息查找: sed -n '/oldboy/p' person.txt
-
多行查找
按照連續的多行查找:
按照行號查找: sed -n '1,3p' person.txt 按照信息查找: sed -n '/oldboy/,/yy/p' person.txt
按照不連續的多行查找:
按照行號查找: sed -n '1p;3p' person.txt 按照信息查找: sed -nr '/101|103|104/p' person.txt sed -n '/101/p;/104/p' person.txt
-
-
增加實踐
-
按照行號增加
文件追加信息指令(行后): a---append 文件插入信息指令(行前): i---insert
最終命令執行信息:
sed '$a106\n107' person.txt sed '2a106\n107' person.txt
-
按照信息增加
sed '/oldboy/a106\n107' person.txt
-
-
刪除實踐
-
單行刪除
刪除文件信息指令: d---delete i---input
sed -i.bak:-i參數必須寫在所有參數最后面
最終命令執行信息:
按照行號刪除: sed '1d' person.txt 按照信息刪除: sed '/oldboy/d' person.txt
刪除文件空行信息:
sed '/^$/d' person.txt sed -n '/^$/!p' person.txt
-
多行刪除
按照行號刪除: sed '1,3d' person.txt 按照信息刪除: sed '/oldboy/,/yy/d' person.txt
-
-
替換實踐
-
文本替換
編輯文件信息參數: i 替換文件信息指令: s c 按行進行信息替換: g (否則只替換每行匹配的第一個信息)
最終命令執行信息:
替換文件信息: sed -i.bak 's#oldboy#oldgirl#g' person.txt
-
反向引用
擴展正則識別參數: -r 調用正則匹配信息: &
最終命令執行信息:
替換文件信息: sed -r 's#(.*)#<\1>#g' person.txt sed -r 's#.*#<&>#g' person.txt echo 123456|sed -r 's#[1-6]{1}#<&>#g' echo 123456|sed -r 's#.#<&>#g'
-
相關案例
1、將nginx.conf中的注釋行全部去掉 [root@localhost ~]# sed '/^ *#/d' /etc/nginx/nginx.conf 2、將nginx.conf中每一行之前增加注釋 [root@localhost ~]# sed 's/.*/# &/g' /etc/nginx/nginx.conf 3、要求一鍵修改本機的ip, 192.168.15.100 ---> 192.168.15.101 172.16.1.100 ---> 172.16.1.101 sed -i 's#.100#.101#g' /etc/sysconfig/network-scripts/ifcfg-eth[01] 4、將/etc/passwd中的root修改成ROOT sed -i 's#root#ROOT#g' /etc/passwd
-
-
拓展實踐
修飾指定信息取反: sed -n '/^$/!p' person.txt 取出文件行號信息: sed '=' person.txt 執行多個相同指令: sed -n '1p;3p;5p' person.txt