sed--一种流编辑器,也是Linux操作系统功能强大的使用工具之一。sed不面向屏幕、非交互式。sed用来把文档或字符串里面的文字经过一系列编辑命令转换为另一种格式输出。sed通常用来匹配一个或多个正则表达式的文本进行处理。这种编辑器非常适合执行重复的编辑操作。



目录

  • sed简介(模式空间和保持空间)

  • 语法格式及选项

  • 地址定界和编辑命令

  • 高级编辑命令

  • sed支持正则表达式的元字符集

  • 案例


一、sed简介(模式空间和保持空间)

    sed按顺序逐行读文件到名为模式空间的临时缓存中,然后对该行执行相应的操作,之后默认清空模式空间中的内容并将操作结果显示至屏幕上;然后读取下一行重复。

    当然sed对每行的操作不具有记忆性,为了记忆以前的操作,提供了一个保持空间,暂存以前的操作,在后边的高级命令时用到。


二、语法格式及选项

    语法:sed + [选项] +  'script' + file  sed默认将处理结果输出至stdout,如果不指定输入文件,则使用stdin输入

    -n 取消自动打印

~]#:sed -n '1p' passwd

(只打印第一行)

    -e + script  多点编辑,即跟多个script

~]#:sed -e '1,2d' -e '$a\root' /etc/passwd

(对/etc/passwd文件删除1到2行,并在行尾追加root)

    -f + script文件 以script文件来编辑文本

    -r 支持扩展正则表达式

    -i.bak备份为.bak结尾的文件并对原文件编辑,除此之外的所有操作都不会对原文件进行修改

~]#:sed -i.orig 's/dog/cat/g' pets

(备份后再替换)


三、地址定界和编辑命令

    script分为两个部分:

         地址定界和编辑命令 后者必不可少

    地址定界:

        n   指定第n行

        $   最后一行

~]#:sed ‘/^$/d’ file

(删除空白行)

        /pattern/   被匹配到的每一行

         地址范围: #,#    #,+#   /pat1/,/pat2/  #,/pat/

             ~      步进

              特别地:1~2  奇数行

            2~2  偶数行

~]#:seq 100 |sed -n '1~2p'

(步进,只显示奇数行)

    编辑命令:

        p 打印

~]#:sed -n '2p' file

(打印file中的第二行至屏幕)

        d 在模式空间中删除行

        a\ + text 行后面追加文本

~]#:sed '/^root.*/a\root' /etc/passwd

(在以root开头的那一行追加root)

        i\ + text 行前面追加文本

~]#:sed '/^root.*/i\root' /etc/passwd

(在以root开头的那一行插入root)

        c\+ text 替换行内容为文本

        w + 文件路径  保存模式空间内容至指定文件中

~]#:sed '2w /path/filename' pets

将第二行保存到指定文件

        W + 文件路径  保存模式空间第一行内容至指定文件

        r + 文件路径  读取指定文件内容到行后

~]#:sed '6r /etc/fstab' file

(读取/etc、fstab文件的内容到file中的第6行后)

        =      加入行号

~]#:sed '=' pets

(在显示的结果前显示行号)

        !      模式空间中匹配行取反处理

    替换:

        s      替换,可在s前面添加地址范围,表示只替换范围内的行

        g      全部替换,如果不加g则只替换每行的第一个匹配的内容

        i      忽略大小写

        /为分隔符,也可以用@,#代替

~]#:sed '1,2s/dog/cat/g'

(将1到2行的所有dog替换成cat)

~]#:sed 's/file/myfile/3'

(将每行第三处出现的file替换成myfile)

~]#:sed 's/^root.*/root/' /etc/passwd

(将root开头的行替换成root)


四、高级编辑命令

    P    打印模式空间开端至\n内容,并追加到默认输出之前(打印模式空间中的第一行)

    h    把模式空间中的内容覆盖至保持空间中

~]#:sed -n '1!G;h;$p' FILE

(逆向显示文件内容)

~]#:sed '1!G;h;$!d' FILE

(逆向显示文件内容)

    H    把模式空间中的内容追加至保持空间中

    g    从保持空间取出数据覆盖至模式空间

~]#:sed ‘g’ FILE

(将每行内容替换为空行)

    G    从保持空间取出内容追加至模式空间

~]#:sed ‘G’ FILE

(每行后加一个空行)

~]#:sed ‘/^$/d;G’ FILE

(每行后加一个空行,已有空白行的,仅显示一个空白行)

    x    把模式空间中的内容与保持空间中的内容进行互换

    n    读取匹配到的行的下一行覆盖至模式空间

~]#:sed -n 'n;p' FILE

(显示偶数行)

~]#:sed 'n;d' FILE

(显示奇数行)

    N    读取匹配到的行的下一行追加至模式空间

    d    删除模式空间中的行

~]#:sed '$!d' FILE

(仅保留最后一行)

    D    如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。          如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环(就是删除模式空间中的第一行)

~]#:sed 'N;D'  FILE

(仅显示最后一行)

~]#:sed '$!N;$!D' FILE

(仅显示文件最后两行)


五、sed支持正则表达式的元字符集

    特别地:

        \(...\)   保存匹配的字符,支持后向引用

~]#: sed 's/\(love\)able/\1rs/'

(将loveable替换成lovers)

        &        保存搜索字符用来替换其他字符

~]#: sed 's/love/&rs/'

(将love替换成lovers)


六、案例

1、删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符

sed -r 's/[[:blank:]]+//' grub2.cfg

2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符

sed 's/^# //' /etc/fstab

3、在centos6系统/root/install.log每一行行首增加#号

 sed 's/^/#/' /root/install.log

4、在/etc/fstab文件中不以#开头的行的行首增加#号

sed 's/^/#/;s/^##/#/' /etc/fstab

5、处理/etc/fstab路径,使用sed命令取出其目录名和基名

 echo /etc/fstab |sed 's@^/.*/@@' (基名)
 echo /etc/fstab |sed -r 's@^(.*/).*@\1@'

6、利用sed 取出ifconfig命令中本机的IPv4地址

ifconfig |sed  -r -n '2s/^[[:space:]]+inet[[:space:]]addr:(.*)Bcast.*/\1/p'

7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数

ls /media/CentOS_6.9_Final_/Packages/ |sed -r 's@.*\.(.*)\.rpm@\1@' | sort |uniq -c

8、统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)

cat /etc/init.d/functions |sed -r 's@[^[:alpha:]]@\n@g' |sort |uniq -c |sort -nr
cat /etc/init.d/functions |egrep -o "\<[[:alpha:]]+\>" |sort |uniq -c |sort -n

9、将文本文件的n和n+1行合并为一行,n为奇数行

sed 'N;s/\n//'