使用方式:
1,前置指令 | sed 选项 定址符指令
2,sed 选项 定址符指令 被处理文档
选项:
-n 屏蔽默认输出
-i写入文件
-r支持扩展正则
指令:
p输出
d删除
s替换
sed -n '1p' user //输出第1行
sed -n '2p' user //输出第2行
sed -n '3p' user //输出第3行
sed -n '2,4p' user //输出第2~4行
sed -n '2,+1p' user //输出第2行以及后面1行
sed -n '2p;4p' user //输出第2行,第4行
sed -n '/^root/p' user //在sed中使用正则表达式输出以root开
头的行
grep "^root" user //效果同上
egrep"^root|^bin" user //找root或者bin开头的行
sed -nr '/^root|^bin/p' user //在sed中查找,-r使用扩展正
则,效果同上
sed -n '=' user //查看所有行号
sed -n '$=' user //查看最后一行的行号,相当于查看文档
总共有几行
sed '1d' user //删第1行
sed 'd' user //删所有
sed '3d' user //删第3行
sed '2,5d' user //删2~5行
sed '4,+2d' user //删4行以及后面2行
sed '1d;3d' user //删第1行,第3行
sed '$d' user //删除最后一行
sed -n '$p' user //查看最后一行
sed -n '1!p' user //查看除了第1行以外的行, !代表取反
sed 中的替换,使用 s/old/new/
vim test.txt //准备素材,写入下列内容
2017 2011 2018
2017 2017 2024
2017 2017 2017
sed 's/2017/8888/' test.txt //替换所有行的第1个2017为8888
sed '1s/2017/8888/' test.txt //替换第1行的第1个2017
sed '2s/2017/8888/' test.txt //替换第2行
sed '1,2s/2017/8888/' test.txt //替换1~2行
sed 's/2017/8888/2' test.txt //替换所有行的第2个2017
sed 's/2017/8888/3' test.txt //替换所有行的第3个2017
sed '/2011/s/2017/8888/' test.txt //替换有2011的行的第1个2017
sed 's/2017/8888/g' test.txt //替换所有行的所有个
sed -n 's/root/6666/p' /etc/passwd //替换每行第1个root,并只显示被替换的行
sed -n 's/root/6666/2p' /etc/passwd //替换每行第2个root,并只显示被替换的行
sed -n 's/root/6666/gp' /etc/passwd //替换每行的所有root
sed '3s/2017/8888/;3s/2017/8888/' test.txt //替换第3行的第1个和第2个2017
尝试将 user 文档中的 /bin/bash 替换成 /sbin/sh
sed 's//bin/bash//sbin/sh/' user //常规手段替换,内容会与替换冲突,替换失败
sed 's/\/bin\/bash/\/sbin\/sh/' user //使用\转义符号,可以成功,但不方便
sed 's!/bin/bash!/sbin/sh!' user //更改替换的间隔符号是最理想方法
sed 's(/bin/bash(/sbin/sh(' user //效果同上
Sed 中 s 替换的高级应用
1 )删除文件中每行的第二个、最后一个字符
sed 's/.//2;s/.$//' test 分两个步骤完成,中间用分号
隔开,第一步将每行的第二个任意字符替换成空,第二
步将每行的最后一个任意字符替换成空即可
2 )删除文件中所有的数字
sed -i 's/[0-9]//g' test 先找到任意数字,然后都替换成空
3 )将文件中每行的第一个、倒数第 1 个字符互换
echo abc > abc //创建素材
sed -r 's/(a)(b)(c)/\3\2\1/' abc //替换abc时复制每一个字符,后面替换的内容用\数字粘贴,可以任意调换位置
echo xyz >> abc //追加内容
sed -r 's/(a)(b)(c)/\3\2\1/' abc //再用之前的方法无法替换第2行
sed -r 's/(.)(.)(.)/\3\2\1/' abc //将具体字符用 . 替代即可将文档中的xyz修改成xyaz时,上述方案失灵
sed -r 's/^(.)(.*)(.)$/\3\2\1/' abc //再次升级,分别找到第1个字符和最后1个字符,中间可以是任意
sed -r 's/^(.)(.*)(.)$/\3\2\1/' test //达成需求
4 )为文件中每个大写字母添加括号
sed -r 's/([A-Z])/(\1)/g' test //先找到任意大写字母,然后保留,最后替换成带括号的状态
练习:
编写脚本,安装 httpd 服务,使用 82 号端口
#!/bin/bash
yum -y install httpd
sed -i '/^Listen 80/s/80/82/' /etc/httpd/conf/httpd.conf //找到有Listen 80开头的行,替换80为82
systemctl restart httpd
运行脚本之后,使用curl 192.168.4.7:82测试或者火狐浏览器192.168.4.7:82
要关闭selinux与防火墙
setenforce 0 //如果脚本执行之前没关闭selinux,会报错
systemctl stop firewalld
sed 中除了常用的 p d s 三个指令,还有 a 行下追加 i 行上添加 c 替换整行
sed 'a 666' user //在所有行下追加666
sed '1a 666' user //第1行下追加666
sed 'i 666' user //所有行上添加666
sed '3i 666' user //第3行上添加666
sed '2a 666' user //第2行下追加666
sed 'c 666' user //所有行替换成666
sed '/root/c 666' user //找到有root的行替换成666
编写脚本,找到系统使用bash的账户名,然后按照"用户名 --> 密码" 的格式存储在一个文件中
"\s"可以匹配tab键和空格所敲出来的空格。
"\w"匹配数字、字母、下划线
sed 的其它指令:
"a"行下追加,逐行处理,如果只处理第一行就用"1a"
"i"行上添加
"c"替换整行