sed是一个文本流编辑器,行编辑器,通常用来处理一行文本。通常是把源文件复制一份,在内存中进行编辑操作。

    sed的简单用法_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的基本用法。