sed命令细说
sed:
工作方式:此命令也是针对文档行的一个命令。他的工作方式同grep一样,工作目标是文档中的行,一样是把文档复制到他的内存中进行操作,只要用户不保存,就不会改变原文件。
磁盘源文件=A地-->复制到内存中的源文件或部分原文件=B地--->操作、筛选或者编辑后的保存在内存中的文件=C地
常用选项:
-n:表示不再输出不符合从B地道C地的内容
-e:可以同时使用多个编辑指令对B地的内容进行编辑、筛选、造作
-f: 后边可以跟一个脚本文件,此脚本文件每行都是一个编辑命令
-r: 支持使用扩展正则表达式
-i : 表示直接对原文件进行编辑,此选项比较危险哦
地址定界:及表示我们要对那些行进行编辑
1): 不给地址,即空地址。 则表示对全文进行处理
2):单地址
#:制定行
3): 一个范围
#,#:
#。+#:
/pat1/,/part2/
4) 步进:-
1-2:表示所有的奇数行
2-2:表示所有的偶数行
sed 常用编辑选项
d : 删除 即删除"B地"的内容
sed '1,5d' /etc/fstab 表示删除1行和5行的内容
sed '/^UUID/d' /etc/fstab 表示删除以UUID开头的每一行
sed '3d' /etc/fstab 表示删除第三行
sed '1-2d' /etc/fstab 表示显示偶数行(因为奇数行被删除了)
p:表示显示"B地"的内容
sed '1~2p' /etc/fstab 表示奇数行显示两遍
sed -n '1~2p' /etc/fstab 表示只显示奇数行 -n的意思是只保留编辑的行为
a\text:指定的模式匹配到的行的后边追加"text",支持使用\n这个符号,实现多行追加
i\text:在指定的模式匹配到的行前边插入"text",支持使用\n这个符号,实现多行追加
例如: sed '5i \do it yourself' /etc/fstab (我把fstab第一行的空格删除了所以是下边的效果)
## /etc/fstab# Created by anaconda on Wed Dec 30 06:43:45 2015#do it yourself# Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
sed '5a \do it yourself' /etc/fstab
## /etc/fstab# Created by anaconda on Wed Dec 30 06:43:45 2015## Accessible filesystems, by reference, are maintained under '/dev/disk'do it yourself# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
如果想在多行下边或者上边插入信息,可以用下操作
sed '/UUID/a \#I will do my best.' /etc/fstab
## /etc/fstab# Created by anaconda on Wed Dec 30 06:43:45 2015## Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#UUID=42725ac6-787d-4be4-a766-a4b9325eba7e / ext4 defaults 1 1#I will do my best.UUID=ec7cf699-9e55-4305-a463-859f8ba83f3b /boot ext4 defaults 1 2#I will do my best.UUID=52937bf3-72c9-48d7-a05c-72726731c995 swap swap defaults 0 0#I will do my best.
可以看出/UUID/=5
c \text:把匹配到的行替换为此处指定的文本"text' 注意:是正行替换,不是只替换某个字符。
例如:
sed '/UUID/c \#I will do my best.' /etc/fstab
## /etc/fstab# Created by anaconda on Wed Dec 30 06:43:45 2015## Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info##I will do my best.#I will do my best.#I will do my best.
w /PATH/TO/FILE: 把挑选出来的行保存到一个路径下,例如"把不是#号开头的行保存到/tmp/temp里去
sed -n '/^[^#]/w /tmp/temp/new.xx' /etc/fstab
[root@marco-linux temp]# cd /tmp/temp[root@marco-linux temp]# lsetc files6 new.xx passwd1 passwd2 passwd3[root@marco-linux temp]# cat new.xxUUID=42725ac6-787d-4be4-a766-a4b9325eba7e / ext4 defaults 1 1UUID=ec7cf699-9e55-4305-a463-859f8ba83f3b /boot ext4 defaults 1 2UUID=52937bf3-72c9-48d7-a05c-72726731c995 swap swap defaults 0 0tmpfs /dev/shm tmpfs defaults 0 0devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0
r /PATH/FROM/SOMEFILE: 合并文件用的~! 此选项的意思是把另外一个文件读取后存放在sed目标文件制定的行处 例如我们把/etc/isssue文件读取出来放在fstab文件的第三行下边
sed '3r /etc/issue' /etc/fstab
## /etc/fstabCentOS release 6.7 (Final)Kernel \r on an \m# Created by anaconda on Wed Dec 30 06:43:45 2015## Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#UUID=42725ac6-787d-4be4-a766-a4b9325eba7e / ext4 defaults 1 1UUID=ec7cf699-9e55-4305-a463-859f8ba83f3b /boot ext4 defaults 1 2UUID=52937bf3-72c9-48d7-a05c-72726731c995 swap swap defaults 0 0tmpfs /dev/shm tmpfs defaults 0 0devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0
= :为每一个能匹配到的行加一个行号 使用方法:sed '/^UUID/= ' /etc/fstab
9UUID=42725ac6-787d-4be4-a766-a4b9325eba7e / ext4 defaults 1 110UUID=ec7cf699-9e55-4305-a463-859f8ba83f3b /boot ext4 defaults 1 211UUID=52937bf3-72c9-48d7-a05c-72726731c995 swap swap defaults 0 0
! : 表示取反 例如"fstab文件中删除所有以不是#开头的行。
sed '/^#/!d' /etc/fstab
## /etc/fstab# Created by anaconda on Wed Dec 30 06:43:45 2015## Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#
s///:查找替换,其分隔符可以自行指定,比如s$$$ s@@@@ 等
替换标记:
g:全局替换
w: /PATH/TO/IILE : 将替换成功的结果保存到指定的文件中
p:显示替换成功的行
例如: sed 's@^[[:space:]]@@' /PATH/TO/FILE 后两个@@之间表示为空
sed 就说这些把。。祝你学习愉快,也祝我学习愉快