sed是一个文本流编辑器,行编辑器,通常用来处理一行文本。通常是把源文件复制一份,在内存中进行编辑操作。
sed每次工作时,是从源文件中复制出一行,放在自己专用的工作车间,称为模式空间(pattern space),经过处理之后,将会送到标准输出(stdout)。默认条件下,sed可以处理文本的所有行,但是我们也可以让sed只处理符合条件的行,比如利用正则表达式进行文版过滤。即sed将行取到模式空间之后,首先要看取出的行是否是sed要关注匹配的到行,即是否跟要给定的模式匹配到的行,然后才进行编辑操作。然后再进行edit,再输出到标准输出。如果没有被给定的模式匹配到,那么就不做编辑,直接输出到标准输出。
sed内存内部还有一部分内存空间,称为保持空间,即hold pace。如果让模式空间跟保持空间的内容互相交换,就可以实现很多高大上的功能。
sed使用的基本格式:
sed [options] ... 'scripts' inputfile...(省略号意味着可以依次处理多行文本)
其中scripts主要包含两部分:
1.地址定界:确定文本处理的范围;地址定界后+编辑命令
(1) 不给地址,空地址:对全文进行处理;
(2) 单地址:
#:一个数字,指定行;
/pattern/:被此模式所匹配到的每一行;
(3) 地址范围
#,#:
#,+#:
#,/pat1/ 斜线必须要有
/pat1/,/pat2/
$:最后一行;
(4) 步进:~
1~2:所有奇数行
2~2:所有偶数行
2.编辑命令
d:删除;
p:显示模式空间中的内容;被地址框定的行;
a \text:在行后面追加文本“text”,支持使用\n实现多行追加;
i \text:在行前面插入文本“text”,支持使用\n实现多行插入;
c \text:把匹配到的行替换为此处指定的文本“text”;整行替换,而不是某个字符;
w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;
r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
=:为模式匹配到的行打印行号;
!:条件取反;
地址定界!编辑命令; 放在命令之前;
s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等;
替换标记
g:全局替换;
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
p:显示替换成功的行;
3.option
常用选项:
-n:不输出模式空间中的内容至屏幕;
-e script, --expression=script:多点编辑,在一个sed中可以指定多个编辑脚本
-f /PATH/TO/SED_SCRIPT_FILE;每行一个编辑命令;
-r, --regexp-extended:支持使用扩展正则表达式;
-i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 ;较危险;
#示例,删除fstab中第1行至第五行:1,5表示1到5行,d表示删除;
[root@wangxin tmp]# cat fstab # # /etc/fstab # Created by anaconda on Sun Dec 6 21:32:10 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=385ac324-78fe-4c44-9727-a12e14996ab4 / xfs defaults 0 0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b /boot xfs defaults 0 0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6 /usr xfs defaults 0 0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190 swap swap defaults 0 0 [root@wangxin tmp]# sed '1,5d' fstab # 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=385ac324-78fe-4c44-9727-a12e14996ab4 / xfs defaults 0 0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b /boot xfs defaults 0 0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6 /usr xfs defaults 0 0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190 swap swap defaults 0 0
##删除"#"开头的所有行 ,d表示删除;
[root@wangxin tmp]# sed '/^#/d' fstab UUID=385ac324-78fe-4c44-9727-a12e14996ab4 / xfs defaults 0 0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b /boot xfs defaults 0 0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6 /usr xfs defaults 0 0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190 swap swap defaults 0 0
###显示fstab的偶数行,d表示删除‘1~2’的行,即奇数行
[root@wangxin tmp]# sed '1~2d' fstab # # Created by anaconda on Sun Dec 6 21:32:10 2015 # Accessible filesystems, by reference, are maintained under '/dev/disk' # UUID=b585757f-8cb2-49e7-add1-e5abae66357b /boot xfs defaults 0 0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190 swap swap defaults 0 0
####fatab的奇数行显示两遍,因为无-n参数,即把模式空间与模式空间处理之后的情况全部显示出来。
[root@wangxin tmp]# sed '1~2p' fstab # # /etc/fstab # /etc/fstab # Created by anaconda on Sun Dec 6 21:32:10 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 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=385ac324-78fe-4c44-9727-a12e14996ab4 / xfs defaults 0 0 UUID=385ac324-78fe-4c44-9727-a12e14996ab4 / xfs defaults 0 0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b /boot xfs defaults 0 0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6 /usr xfs defaults 0 0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6 /usr xfs defaults 0 0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190 swap swap defaults 0 0
#仅显示奇数行,要加-n参数,禁止模式空间中的内容显示
[root@wangxin tmp]# sed -n '1~2p' fstab # /etc/fstab # # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info UUID=385ac324-78fe-4c44-9727-a12e14996ab4 / xfs defaults 0 0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6 /usr xfs defaults 0 0
#在第三行前面插入“new line”字符,添加插入在行之前,用i;
[root@wangxin tmp]# sed '3i new line' fstab # new line # /etc/fstab # Created by anaconda on Sun Dec 6 21:32:10 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=385ac324-78fe-4c44-9727-a12e14996ab4 / xfs defaults 0 0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b /boot xfs defaults 0 0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6 /usr xfs defaults 0 0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190 swap swap defaults 0 0
##在第三行前面插入“new line” 及“another”多行增加用 \n
[root@wangxin tmp]# sed '3i \new line\nanother' fstab # new line another # /etc/fstab # Created by anaconda on Sun Dec 6 21:32:10 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=385ac324-78fe-4c44-9727-a12e14996ab4 / xfs defaults 0 0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b /boot xfs defaults 0 0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6 /usr xfs defaults 0 0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190 swap swap defaults 0 0
###在所有以UUID开头的行的前面添加“add new delice”的注释,a表示添加在符合的行之后;
[root@wangxin tmp]# sed '/^UUID/a \# add new delice ' fstab # # /etc/fstab # Created by anaconda on Sun Dec 6 21:32:10 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=385ac324-78fe-4c44-9727-a12e14996ab4 / xfs defaults 0 0 # add new delice UUID=b585757f-8cb2-49e7-add1-e5abae66357b /boot xfs defaults 0 0 # add new delice UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6 /usr xfs defaults 0 0 # add new delice UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190 swap swap defaults 0 0 # add new delice
#把所有以UUID开头的行替换为“add new delice”,c表示替换;
[root@wangxin tmp]# sed '/^UUID/c \# add new delice ' fstab # # /etc/fstab # Created by anaconda on Sun Dec 6 21:32:10 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 # # add new delice # add new delice # add new delice # add new delice
#显示所有非#开头的行,p表示打印显示
[root@wangxin tmp]# sed -n '/^[^#]/p' fstab UUID=385ac324-78fe-4c44-9727-a12e14996ab4 / xfs defaults 0 0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b /boot xfs defaults 0 0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6 /usr xfs defaults 0 0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190 swap swap defaults 0 0
#将所有非#开头的行写到/root/fstab.new文件,使用w
[root@wangxin tmp]# sed -n '/^[^#]/w /root/fstab.new' fstab [root@wangxin tmp]# cat /root/fstab.new UUID=385ac324-78fe-4c44-9727-a12e14996ab4 / xfs defaults 0 0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b /boot xfs defaults 0 0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6 /usr xfs defaults 0 0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190 swap swap defaults 0 0
#取/etc/issue的内容合并到/etc/fatab的第8行上面,r表示将内容合并;
[root@wangxin tmp]# sed '8r /etc/issue' /etc/fstab # # /etc/fstab # Created by anaconda on Sun Dec 6 21:32:10 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 Kernel \r on an \m Mage Education Learning Services http://www.magedu.com UUID=385ac324-78fe-4c44-9727-a12e14996ab4 / xfs defaults 0 0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b /boot xfs defaults 0 0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6 /usr xfs defaults 0 0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190 swap swap defaults 0 0
#在所有的UUID开头的行前面都添加一个/etc/issue的内容,r表示将内容合并;
[root@wangxin tmp]# sed '/^UUID/r /etc/issue' /etc/fstab # # /etc/fstab # Created by anaconda on Sun Dec 6 21:32:10 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=385ac324-78fe-4c44-9727-a12e14996ab4 / xfs defaults 0 0 \S Kernel \r on an \m Mage Education Learning Services http://www.magedu.com UUID=b585757f-8cb2-49e7-add1-e5abae66357b /boot xfs defaults 0 0 \S Kernel \r on an \m Mage Education Learning Services http://www.magedu.com UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6 /usr xfs defaults 0 0 \S Kernel \r on an \m Mage Education Learning Services
##为每一个UUID开头的行添加行号,=添加行号
[root@wangxin tmp]# sed '/^UUID/=' fstab # # /etc/fstab # Created by anaconda on Sun Dec 6 21:32:10 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 # 9 UUID=385ac324-78fe-4c44-9727-a12e14996ab4 / xfs defaults 0 0 10 UUID=b585757f-8cb2-49e7-add1-e5abae66357b /boot xfs defaults 0 0 11 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6 /usr xfs defaults 0 0 12 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190 swap swap defaults 0 0
#删除所有非#的行,!取非,放在命令d之前
[root@wangxin tmp]# sed '/^#/!d' fstab # # /etc/fstab # Created by anaconda on Sun Dec 6 21:32:10 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 #
#删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符;s之前空格表示全局;
[root@wangxin tmp]# sed ' s@^[[:space:]]\+@@' /etc/grub2.cfg # # DO NOT EDIT THIS FILE # # It is automatically generated by grub2-mkconfig using templates # from /etc/grub.d and settings from /etc/default/grub # ### BEGIN /etc/grub.d/00_header ### set pager=1 if [ -s $prefix/grubenv ]; then load_env fi if [ "${next_entry}" ] ; then set default="${next_entry}" set next_entry= save_env next_entry set boot_once=true else
#删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
[root@wangxin tmp]# sed ' s@^#[[:space:]]*@@' /etc/fstab /etc/fstab Created by anaconda on Sun Dec 6 21:32:10 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=385ac324-78fe-4c44-9727-a12e14996ab4 / xfs defaults 0 0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b /boot xfs defaults 0 0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6 /usr xfs defaults 0 0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190 swap swap defaults 0 0
#删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;并且将UUID的行删除;
使用-e多点编辑;
[root@wangxin tmp]# sed -e 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab /etc/fstab Created by anaconda on Sun Dec 6 21:32:10 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
#输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;将行尾的非/字符替换为空即可,注意锚定行尾,至少出现一次,同时为了避免尾末有斜,在加一个\/?表示可有可无,\表示转义;
[root@wangxin tmp]# echo "/opt/soft/Heartbeat-3.0.5.tar.bz2" | sed ' s@[^/]\+/\?$@@' /opt/soft/
或者
echo "/opt/soft/Heartbeat-3.0.5.tar.bz2" | sed -r ' s@[^/]+/?$@@' /opt/soft/
下面的高级命令需要脑洞大开。
高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g:把保持空间中的内容覆盖至模式空间中;
G:把保持空间中的内容追加至模式空间中;
x:把模式空间中的内容与保持空间中的内容互换;
n:覆盖读取匹配到的行的下一行至模式空间中;
N:追加读取匹配到的行的下一行至模式空间中;
d:删除模式空间中的行;
D:删除多行模式空间中的所有行;
示例:
sed -n 'n;p' FILE:显示偶数行;
sed '1!G;h;$!d' FILE:逆序显示文件的内容;
sed ’$!d' FILE:取出最后一行;
sed '$!N;$!D' FILE:取出文件后两行;
sed '/^$/d;G' FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
sed 'n;d' FILE:显示奇数行;
sed 'G' FILE:在原有的每行后方添加一个空白行;
以上为sed的基本用法。