sed


--- 增   a后 i前 c换
--- 删   d
--- 改   s///g
--- 查   n   //

sed命令的执行流程

1.sed先是按行读取文件内容
2.每读取一行内容,都会进行一次判断,是不是你想要的行
3.如果不是,则判断是不是加了-n选项
4.如果加了-n,就读取下一行
5.如果没加-n,就会将所有内容输出到命令行(默认输出)
6.如果是,你想要的那一行(第三行)则判断执行的后续动作(p d s a i c)
7.动作处理完成后,输出指定的内容
8.即便是读取完了,内容也输出了,sed也会继续往后读,直到文件的最后一行

--- 1.txt ---
1,zls,666
2,wls,777
3,cls,888
4,lls,999

[root@m01 test]# sed -n '3p' 1.txt
3,cls,888
[root@m01 test]# sed '3p' 1.txt
1,zls,666
2,wls,777
3,cls,888
3,cls,888
4,lls,999

-n # 打印你匹配的行
不加-n # 打印你匹配的行 & 所有的文件内容

sed 查

p: 打印 显示
# 打印/etc/passwd的第一行
sed -n '1p' /etc/passwd
# 打印 1.txt 的 一到三行
sed -n '1,3p' 1.txt
1,zls,666
2,wls,777
3,cls,888
# 打印带有关键字的行
sed -n '/cls/p' 1.txt
3,cls,888
# 打印带有cls 和 wls的行
sed -n '/cls/,/wls/p' 1.txt
3,cls,888
4,lls,999
# sed去实现 grep -A
[root@m01 test]# sed -n '/zls/,+2p' 1.txt
1,zls,666
2,wls,777
3,cls,888
[root@m01 test]# sed -n '/zls/,+1p' 1.txt
1,zls,666
2,wls,777
# sed 读一行隔一行
sed -n '1~2p' 1.txt
1,zls,666
3,cls,888

sed 删

d 删除
# 在标准输出上面删除了第一行的内容(不会影响文件内容)
sed '1d' 1.txt
2,wls,777
3,cls,888
4,lls,999
# 如果要真的删除第一行 得加上i 选项
sed -i '1d' 1.txt
# 在标准输出上删除文件最后一行的内容
sed '$d' 1.txt
1,zls,666
2,wls,777
3,cls,888
# 范围删除
[root@m01 test]# cat 1.txt
1,zls,666
2,wls,777
3,cls,888
4,lls,999
[root@m01 test]# sed '/wls/,$d' 1.txt
1,zls,666

sed 增

cai
c
a append 后面追加
i insert 前面追加
# append
[root@m01 test]# sed '$a1.5,lls,000' 1.txt
1,zls,666
2,wls,777
3,cls,888
4,lls,999
1.5,lls,000
[root@m01 test]# sed '1a1.5,lls,000' 1.txt
1,zls,666
1.5,lls,000
2,wls,777
3,cls,888
4,lls,999

# i insert
[root@m01 test]# sed '1i0.5,lls,000' 1.txt
0.5,lls,000
1,zls,666
2,wls,777
3,cls,888
4,lls,999
[root@m01 test]# sed '&i0.5,lls,000' 1.txt
sed: -e expression #1, char 1: unknown command: `&'
[root@m01 test]# sed '$i0.5,lls,000' 1.txt
1,zls,666
2,wls,777
3,cls,888
0.5,lls,000
4,lls,999

# c replace 替换
[root@m01 test]# sed '1c1.5,lls,000' 1.txt
1.5,lls,000
2,wls,777
3,cls,888
4,lls,999
[root@m01 test]# sed '$c1.5,lls,000' 1.txt
1,zls,666
2,wls,777
3,cls,888
1.5,lls,000

sed 改

's###g'
s # 替换 substitute
g # 全局 global
# 替换lls为kls
sed 's#lls#kls#g' 1.txt
1,zls,666
2,wls,777
3,cls,888
4,kls,999
# 将所有的数字换位aaa 1个数字就是aaa
sed 's#[0-9]#aaa#g' 1.txt
aaa,zls,aaaaaaaaa
aaa,wls,aaaaaaaaa
aaa,cls,aaaaaaaaa
aaa,lls,aaaaaaaaa

sed 后向引用

sed