sed 工具介绍 (替换, 及替换指定的字符)
sed 介绍: sed 工具主要是替换的文本输出到屏幕上, 而且还有其他更丰富的功能.
sed 命令格式: sed -n 'n' p filename, 单引号内的 n 是一个数字, 表示几行.
-n 选项的作用就是只显示我们要打印的行, 无关紧要的内容不显示.
创建一个 sed 目录, 把 passwd 文件拷贝进来, 方便后面学习.
- [root@localhost ~]# mkdir sed #创建一个目录
- [root@localhost ~]# cd sed/ #进入到目录 sed
- [root@localhost sed]# cp /etc/passwd test.txt
- #拷贝 passwd 文件到本目录下, 并且修改名字
- [root@localhost sed]# ls #查看当前目录下都有哪些文件
- test.txt
- [root@localhost sed]# pwd #当前所在的位置
- /root/sed
只显示我们需要查找的内容显示出来, 示例如下:-n
- [root@localhost sed]# sed -n '/root/'p test.txt
- root:x:0:0:root:/root:/bin/bash
- operator:x:11:0:operator:/root:/sbin/nologin
- #-n 选项是指显示我们要打印的行.
在 grep 中使用的特殊字符如 (^ $ * 等) 都可以在 sed 中使用.
指定一个区间打印, 比如指定一个区域 2-3 行, 示例如下:-n
- [root@localhost sed]# sed -n '2,3'p test.txt
- bin:x:1:1:bin:/bin:/sbin/nologin
- daemon:x:2:2:daemon:/sbin:/sbin/nologin
sed 命令加上 - e 选项可以实现多个行为, 示例如下:-e
- [root@localhost sed]# sed -e '1'p -e '/bus/'p -n test.txt
- root:x:0:0:root:/root:/bin/bash
- dbus:x:81:81:System message bus:/:/sbin/nologin
- #sed -e 实现多个行为, 如我查找第一行, 并且 把文档中含有 bus 的显示出来
如果需求说查找一个文件, 把 bus 不管大小写都列出来, I
- [root@localhost sed]# sed -n '/bus/'Ip test.txt #这里一定要加一个大 I 字母.
- dbus:x:81:81:System message bus:/:/sbin/nologin
- BUS
删除某些行 (并非删除), 把剩下的行数都显示出来, 示例如下: d
- [root@localhost sed]# sed '1,18'd test.txt
- chrony:x:998:996::/var/lib/chrony:/sbin/nologin
- BUS
- # 这里后面跟选项 d, 会把 1 到 18 行的内容删除, 把后面的内容显示出来.
这里参数 d 表示删除的东西, 它不仅可以删除指定的单行以及多行, 而且可以删除匹配某个字符的行, 还可以删除从某一行开始到文档最后一行的所有行, 这个命令仅仅是在屏幕上并不显示这些行.
sed 真正删除选中的行数, 示例如下:-i
首先先拷贝一份文件过来:
- [root@localhost sed]# cp test.txt test.txt.bak #拷贝过来个备份
- [root@localhost sed]# ls #查看当前目录下的文件
- test.txt test.txt.bak
- [root@localhost sed]# wc -l test.txt #wc 查看一个文件有多少行
- 20 test.txt
- [root@localhost sed]# sed -i '1,18'd test.txt #-i 删除 1 到 18 行.
- [root@localhost sed]# wc -l test.txt #再来看这个文件有多少行.
- 2 test.txt
-i 还可以指定删除某个字符的行, 示例如下://
- [root@localhost sed]# sed '/root/'d test.txt
- chrony:x:998:996::/var/lib/chrony:/sbin/nologin
- BUS
全局指定替换 1,10 行. s
- [root@localhost sed]# sed '1,10s/root/toor/g' test.txt
- #1,10 是范围, 后面跟 s 是替换,/root / 替换成 / toor/,g 表示全局替换.
- toor:x:0:0:toor:/toor:/bin/bash
- bin:x:1:1:bin:/bin:/sbin/nologin
- daemon:x:2:2:daemon:/sbin:/sbin/nologin
- adm:x:3:4:adm:/var/adm:/sbin/nologin
- lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
上述中的参数 s 就表示替换的动作, 参数 g 表示本行全局替换, 如果不加 g 只会替换本行出现的第一个.
调整两个字符串的位置, 示例如下: -r
第一段和最后一段替换位置
- [root@localhost sed]# head test.txt | sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:1/'
- /bin/bash:x:0:0:root:/root:1
- /sbin/nologin:x:1:1:bin:/bin:1
- /sbin/nologin:x:2:2:daemon:/sbin:1
- /sbin/nologin:x:3:4:adm:/var/adm:1
- /sbin/nologin:x:4:7:lp:/var/spool/lpd:1
- /bin/sync:x:5:0:sync:/sbin:1
- /sbin/shutdown:x:6:0:shutdown:/sbin:1
- /sbin/halt:x:7:0:halt:/sbin:1
- /sbin/nologin:x:8:12:mail:/var/spool/mail:1
- /sbin/nologin:x:11:0:operator:/root:1
小括号在 sed 中属于特殊符号, 必须在前面加转义字符 \, 替换时则携程类似 \ 1,\2 或 \ 3 的形式, 上列中 () 把想要替换的字符打包成了一个整体, 有这个转义字符 \,-r 选项让这个表达式更加清晰了.
查看一个文档当中, 所有的数字不包含字符.
- [root@localhost sed]# head test.txt |sed 's/[a-zA-Z]//g' #这里括号里的是范围
- ::0:0::/://
- ::1:1::/://
- ::2:2::/://
- ::3:4:://://
- ::4:7::///://
- ::5:0::/://
- ::6:0::/://
- ::7:0::/://
- ::8:12::///://
- ::11:0::/://
如果给文档前面统一添加个字符串, 比如 aaa, 示例如下:
- [root@localhost sed]# head test.txt | sed -r 's/(.*)/aaa:&/' #& 表示星号前所有
- aaa:root:x:0:0:root:/root:/bin/bash
- aaa:bin:x:1:1:bin:/bin:/sbin/nologin
- aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin
- aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin
- aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
- aaa:sync:x:5:0:sync:/sbin:/bin/sync
- aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
- aaa:halt:x:7:0:halt:/sbin:/sbin/halt
- aaa:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
- aaa:operator:x:11:0:operator:/root:/sbin/nologin
来源: http://www.bubuko.com/infodetail-2572835.html