sed学习
sed 基本格式
sed -e '操作' 文件1 文件2
sed -e '操作' 文件1 文件2
sed -f 脚本文件 文件1 文件2
sed -i -e '操作' 文件1 文件2
执行多条命令的格式
方式一:
sed -e '操作1' -e '操作2' 文件
sed -n -e '/^r/p' -e '/^b/p' /etc/passwd
方式二:
sed -e '操作1;操作2'
常用选项

| 选项 | 说明 |
| -e 或--expression= | 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用 |
| -f 或--file= | 表示用指定的脚本文件来处理输入的文本文件 |
| -i | 直接修改目标文本文件 慎用 |
| -n | 仅显示script处理后的结果 |

常用操作符
| 操作符 | 说明 |
| s | 替换,替换指定字符 |
| d | 删除,删除选定的行 |
| a | 增加,在当前行下面插入一行指定内容 |
| i | 插入,在选定行上面插入一行指定内容 |
| c | 替换,将选定行替换为指定内容 |
| y | 字符转换,转换前后的字符长度必须相同 |
| p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。 |
| = | 打印行号 |
| l | 打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t) |
| r | 扩展正则表达式 |
梨子:
仅打印低几行
[root@shell 98]# ifconfig ens33 | sed -n '2p' #打印第二行
inet 192.168.23.10 netmask 255.255.255.0 broadcast 192.168.23.255
指定间隔打印
[root@localhost sed]#sed -n -e '2p' -e'$p' test1.txt ---打印第二行和最后一行
[root@localhost sed]#sed -n -e '2p' -e'3p' test1.txt ---打印第二行和第三行
对奇数行和偶数行打印
[root@localhost sed]#sed -n 'n;p' test1.txt ---打印偶数的行
[root@localhost sed]#sed -n 'p;n' test1.txt ---打印奇数的行
n在p前面,跳过一行,打印下一行,就是偶数行;在后面,就是打印第一行,然后跳过一行,形成奇数行
sed 的删除操作
sed -i 时会对文本进行实际操作(建议对目标文件先进行备份,再进行操作)
[root@localhost sed]#sed 'd' test1.txt ---删除所有,什么也不打印
[root@localhost sed]#sed -n '3d;p' test1.txt ---删除第三行,打印剩余的所有内容
[root@localhost sed]#sed -n '5,8d;p' test1.txt ---删除5到8行,打印剩余的所有内容
[root@localhost sed]#sed -n '5,$d;p' test1.txt ---删除5到最后一行行,打印剩余的所有内容
[root@localhost sed]#sed '4,6!d' test1.txt ---除了4-6行,其他的全部删除
如果要生效:sed -i -n
————————————————
匹配字符串删除
[root@localhost sed]#sed '/one/d' test1.txt ---删除包含one的行
[root@localhost sed]#sed '/one/,/six/d' test1.txt ---删除one-six的行
[root@localhost sed]#sed '/one/,/six/!d' test1.txt ---除了one-six的行,其余的全部删除,反向删除
[root@localhost sed]#sed '/six/!d' test1.txt ---除了six的行,其余的全部删除,反向删除
[root@localhost sed]#sed '/^$/d' test1.txt ---通过^$,来删除空行;
————————————————
sed的替换操作
替换标记
数字:表明新字符串将替换第几处匹配的地方
g:表面新字符串将会替换所有匹配的地方
p:打印与替换命令匹配的行,与-n一起使用
w文件:将替换的结果写入文件中
替换符
s:替换字符串
c:整行替换
y:字符替换,替换前后的字符串长度必须相同
梨子
[root@localhost sed]#sed -n 's/root/test/2p' /etc/passwd --指定每一行的第二个root,替换为了test
[root@localhost sed]#sed -n 's/root/test/gp' /etc/passwd --所有的root都替换为test
[root@localhost sed]#sed -n '/^root/ s/^/#/p' /etc/passwd --以root开头开始处理,把开头为空的替换为#,注释掉
————————————————
字母大小写替换
[root@localhost sed]#sed 's/[A-Z]/\l&/g' test1.txt ---将大写全部转换为小写,
l&(小写字母)是转换小写的一种特殊的符号,前面要加转义符“\”
[root@localhost sed]#sed 's/[a-z]/\u&/' test1.txt ---把首字母替换成大写,
u&是转换首字母大写的一种特殊的符号,前面要加转义符“\”
root@docker1 ~]# sed -n "2s/[a-z]/\u&/gp" 1.txt 替换第二行
[root@docker1 ~]# sed -n "3s/[a-z]/\u&/gp" 1.txt 替换第三行
单字符替换
[root@localhost sed]# sed 'y/TH/12/' test1.txt #字符长度一样,12替换TH
————————————————
sed 命令的增加
a:在下一行添加内容
i:在上一行插入内容
r:在行后读入文件内容
[root@localhost sed]# sed '/three/a 123' test1.txt #行后
[root@localhost sed]# sed '/three/i 123' test1.txt #上一行
[root@test1 opt]# sed '/three/r test.sh' 123.txt #当前行的下一行
————————————————
[root@localhost sed]# sed '$r test2.txt' test1.txt ---先读取test1内容,然后在test1的末行插入test2的所有内容
[root@localhost opt]# sed '$a 123' 123.txt #在123.txt的文件最后一行插入123
[root@localhost opt]# sed '$i 123' 123.txt #在123.txt的文件最后后面的行中插入 倒数第二行
————————————————
字符串字符替换
[root@docker1 ~]# echo 123456|sed -r 's/(123)(456)/\2\1/'
456123
[root@docker1 ~]# echo helloworld| sed -r 's/(hello)(world)/\2\1/'
worldhello
[root@localhost sed]#echo 123abc|sed -r 's/(.)(.)(.)(.)(.)(.)/\6\5\4\3\2\1/' #前面的点表示字符位置,后面的数字表示对应的交换顺序
交换前后单词顺序
sed 's/\([a-zA-Z]\+\s+\)\([a-zA-Z]\+\)/\2 \1/' 1.txt
\转义符,[a-zA-Z]\+表示前面字母出现1+无数次,\s+表示出现1+无数次空格
修改网卡的IP地址
[root@localhost network-scripts]# sed -i '/IPADDR=192.168.233.21/c IPADDR=10.10.10.10' ifcfg-ens33
[root@localhost network-scripts]# cat ifcfg-ens33
TYPE=Ethernet
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.10.10.10
NETMASK=255.255.255.0
GATEWAY=192.168.233.2
DNS1=192.168.233.2
[root@localhost network-scripts]# sed -i 'y/10.10.10.10/192.168.233.21/' ifcfg-ens33 #用单个字符串替换会报错
sed:-e 表达式 #1,字符 29:“y”命令的字符串长度不同
浙公网安备 33010602011771号