Linux学习----文本三剑客——sed(马哥教育原创)

文本三剑客——sed(原创)

我以前的文章介绍过grep了,今天我就来说一下第二个sed,它是stream editor的缩写。在Linux的文本文件中文本存储都是一行,显示时表现的多行其实都是因为有换行符的存在,例如:文本是:abc$def$ghi 显示出来就是三行了。Sed就是一个行编辑器,它一次读一行文本进行操作,然后根据我们的选择看是否同步到文本之中。还有一个叫awk的,在Linux上叫做gawk(gnu awk),它是一个文本格式化工具,我们下一篇文章再说。

         工作机制:每次读取一行文本至“模式空间(pattern space)”中,在模式空间中完成处理;将处理结果输出至标准输出设备;

         语法:sed[OPTION]… {script} [input-file]…

                  -r:支持扩展正则表达式;

                  -n:静默模式;

                  -escript1 -e script2 -e script3:指定多脚本运行;

                  -f/path/to/script_file:从指定的文件中读取脚本并运行;

                  -i:直接修改源文件;

      地址定界:

                  #:指定行;

                  $:最后一行;

                  /regexp/:任何能够被regexp所匹配到的行;sed ‘/^#/d’ /etc/fstab #删除以井号开头的行

                  \%regexp%:同上,只不过换作%为regexp边界符;

                  /regexp/|:匹配时忽略字符大小写;

                  \%regexp%|:匹配时忽略字符大小写;

                  startline,endline:

                           #,/regexp/:从#行开始,到第一次被/regexp/所匹配到的行结束,中间的所有行;

                          #,#

                           /regexp1/,/regexp2/:从第一次被/regexp1/匹配到的行开始,到第一次被/regexp2/匹配到的行结束,中间的所有行;

                          #,+|-n:从#行开始,一直到向下的n行;

                           first~step:指定起始行,以及步长;

      sed的编辑命令

                          d:删除模式空间中的行;sed ‘1,2d’/etc/fstab

                          =:显示行号;sed ‘/^#/=’ /etc/fstab #显示以#号开头的行的行号

                          a\text:附加text;sed ‘/^#/a \new line’ /etc/fstab        #在以井号开头行的后面添加new line字样

                                   sed‘1a \new line\nsecond line\ntherid line’    #\n表示换行符

                          i\text:插入text,支持\n实现多行插入;

                          c\text:用text替换匹配到的行;sed ‘/5,7/c \new txt’                 #五到七行都替换成一个new txt

                                   sed‘/^#/c \new txt’ /etc/fstab     #只有井号开头的行都替换成new txt,不只一个

                          p:打印模式空间中的行;sed ‘5,7p’/etc/fstab       #5-7行的内容显示两遍,使用-n才符合我们的期望

                          s/regexp/replacement/:替换由regexp所匹配到的内容为replacement;

                                   g:全局替换;

                                   i:不区分大小写    #sed ‘s/^#//g’ /etc/fstab

                          w/path/to/somefile:把指定的内容另存至/path/to/somefile路径所指定的文件中;

                                   #sed ‘5,9w /tmp/test1.txt’ /etc/fstab #将fstab中的5-9行写到test1.txt中

                          r/path/from/somefile:在文件的指定位置插入另一个文件的所有内容,完成文件合并;

                                   #sed‘8r /etc/issue’ /etc/fstab      #将issue的第8行之后的内容读进来放到fstab之前

            练习:

                                   (1)删除/boot/grub/grub.conf文件中所有行的行首的空白字符;

                                            sed’s/^[[:space:]]\+//’ /boot/grub/grub.conf

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

                                            sed’s/^#[[:space:]]\+//’ /etc/fstab

                                   (3)把/etc/fstab文件的奇数行另存为/tmp/fstab.3;

                                            sed’1~2w /tmp/fstab.3′ /etc/fstab

                                   (4)echo一个文件路径给sed命令,取出其基名;进一步地,取出其路径名;

                                            取基名:echo”/etc/sysconfig/network-scripts/” | sed ‘s@^.*/\([^/]\+\)/\?$@\1@’

                                            取路径名:echo”/etc/sysconfig/network-scripts/” | sed ‘s@[^/]\+/\?$@@’

Sed不仅有一个模式空间,还有一个保持空间,它可以帮助sed暂时存储一些东西以便后续的使用。

            高级命令:

                                   h:用模式空间中的内容覆盖保持空间的内容;

                                   H:把模式空间中的内容追加至保持空间中内容的后面;

                                   g:从保持空间中取到其内容,并将其覆盖模式空间中的内容;

                                   G:从保持空间中取到其内容,并将其追加在模式空间中的内容的后面;

                                   x:把保持空间和模式空间中的进行交换;

                                   n:读取匹配到的行的下一行至模式空间;(会覆盖模式空间中的原有内容);

                                   N:读取匹配到的行的下一行至模式空间,追加在模式空间中原有内容的后面;

                                   d:删除模式空间中的内容;

                                   D:删除多行模式空间中的首行;

                                   注意:命令功能可使用!取反;分号可用于分隔脚本;

                  示例:

                                   sed’G’ /etc/issue:在文件中的每行后方添加空白行;

                                   sed’$!d’ /etc/fstab:保留最后一行;

                                   sed’/^$/d;G’ /etc/issue:保证指定的文件每一行后方有且只有一个空白行;

                                   sed’n;d’ /etc/issue:保留奇数行;

                                   sed-n ‘1!G;h;$p’ /etc/issue:全文倒叙显示

                                   sed’$!N;$!D’ /etc/issue:显示最后两行

                  sed命令:

                          -e’script’ -e ‘script’

                          ‘script;script;script’与上一行模式相同

                          script

                          script

                          script

                          -f/path/from/script都是第一行的作用

《Linux学习----文本三剑客——sed(马哥教育原创)》 Linux学习

    原文作者:风度i
    原文地址: https://www.jianshu.com/p/36f1374c4127
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞