sed命令用于处理文本,文本按行处理。sed处理文本时,文本内容将放在模式空间中。处理后,将输出模式空间中的文本内容。该文件不会更改文件本身的内容,只会更改模式空间的临时内容。
用法
view sourceprint?1.sed 'AddressCommand' file ...
Address:可以理解为定位数据,通过一系列的操作,筛选出需要的数据
Command:对选出的数据(行)进行一些什么样的操作
下面分开来说

例:以/etc/fstab文件为例
view sourceprint?01.#
02.# /etc/fstab
03.# Created by anaconda on Mon Aug 11 16:27:41 2014
04.#
05.# Accessible filesystems, by reference, are maintained under '/dev/disk'
06.# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
07.#
08.UUID=e76a7b8d-20c2-4f94-bdd1-f4054a34c206 / ext4 defaults,barrier=0 1 1
09.tmpfs /dev/shm tmpfs defaults 0 0
10.devpts /dev/pts devpts gid=5,mode=620 0 0
11.sysfs /sys sysfs defaults 0 0
12.proc /proc proc defaults 0 0
删除前10行
view sourceprint?1.[root@iZ28g26851kZ ~]# sed '1,10d' /etc/fstab
2.devpts /dev/pts devpts gid=5,mode=620 0 0
3.sysfs /sys sysfs defaults 0 0
4.proc /proc proc defaults 0 0
5.[root@iZ28g26851kZ ~]#
删除#号开头的行
view sourceprint?1.[root@iZ28g26851kZ ~]# sed '/^#/d' /etc/fstab
2.
3.UUID=e76a7b8d-20c2-4f94-bdd1-f4054a34c206 / ext4 defaults,barrier=0 1 1
4.tmpfs /dev/shm tmpfs defaults 0 0
5.devpts /dev/pts devpts gid=5,mode=620 0 0
6.sysfs /sys sysfs defaults 0 0
7.proc /proc proc defaults 0 0
8.[root@iZ28g26851kZ ~]#
例:显示以#号开头的行
view sourceprint?01.[root@iZ28g26851kZ ~]# sed '/^#/p' /etc/fstab
02.
03.#
04.#
05.# /etc/fstab
06.# /etc/fstab
07.# Created by anaconda on Mon Aug 11 16:27:41 2014
08.# Created by anaconda on Mon Aug 11 16:27:41 2014
09.#
10.#
11.# Accessible filesystems, by reference, are maintained under '/dev/disk'
12.# Accessible filesystems, by reference, are maintained under '/dev/disk'
13.# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
14.# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
15.#
16.#
17.UUID=e76a7b8d-20c2-4f94-bdd1-f4054a34c206 / ext4 defaults,barrier=0 1 1
18.tmpfs /dev/shm tmpfs defaults 0 0
19.devpts /dev/pts devpts gid=5,mode=620 0 0
20.sysfs /sys sysfs defaults 0 0
21.proc /proc proc defaults 0 0
22.[root@iZ28g26851kZ ~]#
居然显示了2遍,不但如此,没有被匹配到的行也显示出来了,
为什么呢?
如前所述,sed处理文本首先被读取到模式空间中。显示处理后,将执行先前的删除。Sed删除模式空间中与匹配结果相匹配的行,然后显示模式空间中的其余行。没问题,但是现在,sed显示匹配结果,但同时也在模式空间中显示内容,所以存在这种尴尬的情况~~
怎么解决呢?
-n
使用-n命令可以开启静默模式,也就是不会再将模式空间中的内容显示出来,而是只显示匹配到的结果
view sourceprint?01.[root@iZ28g26851kZ ~]# sed -n '/^#/p' /etc/fstab
02.#
03.# /etc/fstab
04.# Created by anaconda on Mon Aug 11 16:27:41 2014
05.#
06.# Accessible filesystems, by reference, are maintained under '/dev/disk'
07.# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
08.#
09.[root@iZ28g26851kZ ~]#
例:在所有的#号所在行之下再添加一行 “test”
view sourceprint?01.[root@iZ28g26851kZ ~]# sed '/^#/a est' /etc/fstab
02.
03.#
04.test
05.# /etc/fstab
06.test
07.# Created by anaconda on Mon Aug 11 16:27:41 2014
08.test
09.#
10.test
11.# Accessible filesystems, by reference, are maintained under '/dev/disk'
12.test
13.# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
14.test
15.#
16.test
17.UUID=e76a7b8d-20c2-4f94-bdd1-f4054a34c206 / ext4 defaults,barrier=0 1 1
18.tmpfs /dev/shm tmpfs defaults 0 0
19.devpts /dev/pts devpts gid=5,mode=620 0 0
20.sysfs /sys sysfs defaults 0 0
21.proc /proc proc defaults 0 0
22.[root@iZ28g26851kZ ~]#
例:将#号开头的行保存到test10.txt文件中
view sourceprint?01.[root@iZ28g26851kZ ~]# sed '/^#/w test10.txt' /etc/fstab
02.
03.#
04.# /etc/fstab
05.# Created by anaconda on Mon Aug 11 16:27:41 2014
06.#
07.# Accessible filesystems, by reference, are maintained under '/dev/disk'
08.# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
09.#
10.UUID=e76a7b8d-20c2-4f94-bdd1-f4054a34c206 / ext4 defaults,barrier=0 1 1
11.tmpfs /dev/shm tmpfs defaults 0 0
12.devpts /dev/pts devpts gid=5,mode=620 0 0
13.sysfs /sys sysfs defaults 0 0
14.proc /proc proc defaults 0 0
15.[root@iZ28g26851kZ ~]# ls
16.exittest.sh libiconv-1.14 mhash-0.9.4.tar.gz mysql-5.1.51.tar.gz nginx-1.8.0.tar.gz test10.txt
17.filetest.sh libiconv-1.14.tar.gz mysql-5.1.51 nginx-1.8.0 shifttest.sh vartest.sh
18.[root@iZ28g26851kZ ~]# cat test10.txt
19.#
20.# /etc/fstab
21.# Created by anaconda on Mon Aug 11 16:27:41 2014
22.#
23.# Accessible filesystems, by reference, are maintained under '/dev/disk'
24.# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
25.#
26.[root@iZ28g26851kZ ~]#
例:将所有的 / 替换成 “@O@”
view sourceprint?01.[root@iZ28g26851kZ ~]# sed 's#/#@O@#g' /etc/fstab
02.
03.#
04.# @O@etc@O@fstab
05.# Created by anaconda on Mon Aug 11 16:27:41 2014
06.#
07.# Accessible filesystems, by reference, are maintained under '@O@dev@O@disk'
08.# See man pages fstab(5), findfs(8), mount(8) and@O@or blkid(8) for more info
09.#
10.UUID=e76a7b8d-20c2-4f94-bdd1-f4054a34c206 @O@ ext4 defaults,barrier=0 1 1
11.tmpfs @O@dev@O@shm tmpfs defaults 0 0
12.devpts @O@dev@O@pts devpts gid=5,mode=620 0 0
13.sysfs @O@sys sysfs defaults 0 0
14.proc @O@proc proc defaults 0 0
15.[root@iZ28g26851kZ ~]#
-i
之前说过sed所有的操作都是针对模式空间进行的,并不会影响到源文件,
那如果确实像将源文件修改掉呢?
那就使用-i选项
这样就直接操作的是源文件了,所以慎用~~
-e
同时执行多个脚本
view sourceprint?1.sed -e 'AddressComment' -e 'AddressComment' file ...
-f
将脚本写到一个文件中,每一行为一个脚本,然后,,,
view sourceprint?1.sed -f /xxx/xxx.xx file ...
-r
支持扩展正则表达式
======================================
例:从文件目录中找出文件的目录
view sourceprint?1.[root@iZ28g26851kZ ~]# echo '/test/test2/etc/passwd' | sed -r 's@^(/.*/).+/?@@'
2./test/test2/etc/
3.[root@iZ28g26851kZ ~]#
例:从文件目录中找出文件名
view sourceprint?1.[root@iZ28g26851kZ ~]# echo '/test/test2/etc/passwd' | sed -r 's@^(/.*/)(.+)/?@@'
2.passwd
3.[root@iZ28g26851kZ ~]#
笔记本电脑维修点网站内容来源:https://vip-chn.com/book/computer/371.html