第9章 文本处理工具sed

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第9章 文本处理工具sed相关的知识,希望对你有一定的参考价值。

笔记整理开始时间:2018年4月17日08:45:48

 

更多内容请点击:

Linux学习从入门到打死也不放弃,完全笔记整理(持续更新,求收藏,求点赞~~~~) 

http://blog.51cto.com/13683480/2095439


第9章 文本处理工具sed

 

本章内容

        sed介绍

        sed用法

        sed高级用法

        

文本处理工具sed

        Stream EDitor,行编辑器

        又称流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时

        缓冲区,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中

        的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下一行,执行下

        一个循环。

        如果没有使用诸如“D”的特殊命令,那会在两个循环之间清空模式空间,但不

        会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非

        你使用重定向存储输出。

        功能:

               主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

        参考:http://www.gnu.org/software/sed/manual/sed.html

        

sed用法:

        sed [option]..'script' inputfile..

        常用选项:

               -n           不输出模式空间内容到屏幕,即不自动打印

               -e           多点编辑

               -f /path/scipt_file           从指定     文件中读取编辑脚本

               -r           使用扩展的正则表达式

               -i.bak:     备份文件并原处编辑

        scrip:

               '地址命令'              地址+命令

 

地址定界:

        不给地址:对全文进行处理

        单地址:

               #:指定的行,

               $:最后一行

               /pattern/: 被此处模式所能够匹配到的每一行

        地址范围:

               #,#         第#行到第#行到第#行

               #,[email protected]    第#行到第#[email protected]

               /pat1/,/par2/  匹配part1的行到匹配part2的行

               #,/part/        第#行到匹配part的行

               ~:步进

                     1~2       奇数行

                     2~2        偶数行

                    

编辑命令:

               d             删除模式空间匹配的行,并立即启用下一轮循环

               p             打印当前模式空间内容,追加到默认输出之后

               a[\]text:   在指定行后面追加文本

                                    支持使用\n实现多行追加

               i[\]text:    在指定行前面插入文本

               c[\]text:   替换行尾单行或多行文本

               w /path/somefile:   保存模式匹配的行至指定文件

               r /path/somefile:    读取指定文件的文本至模式空间中

                                                  匹配到的行后

               =:                为模式空间中的行打印行号

 

查找替换:

        s///: 查找替换,支持使用其他分隔符,[email protected]@@,s###

        替换标记:

               g:行内全局替换

               p:显示替换成功的行

               w /pash/to/somefile:     将替换成功的行保存至文件中

        -n   pgw file  全局替换且打印匹配行 并保存匹配行至文件

               

sed 示例:

        sed '2p' /etc/passwd             

        sed -n '2p' /etc/passwd

        sed -n '1,4p' /etc/passwd

        sed -n '2,/root/p'    /etc/passwd

        sed -n -e '/^$/p' -e '/^$/=' file   sed -n '/^$/p;/^$/=' file

        sed '/root/a\hello' /etc/passwd

        sed '/root/i\hello' /etc/passwd

        sed '/root/c\hello' /etc/passwd

        

        sed '/^$/d' file                     删除空行

        sed '/1,10d' file    

        nl /etc/passwd |sed '2,5d'                   nl = cat -b  非空行编号    

        nl /etc/passwd |sed '2a tea'   行后插入tea

        sed 's/test/mytest/g' file      全文查找替换

        sed -n 's/root/&superman&/p'    /etc/passwd        添加替换  &引用原文

        sed -e  's/dog/cat/' -e 's/hi/lo/'  pets

        sed -i.bak 's/dog/cat/g'        pets

        

高级编辑命令:

        P     打印模式空间开端至\n内容,并追加到默认输出之前

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

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

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

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

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

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

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

        d     删除模式空间中的行

        D      如果模式空间中包含换行符,则删除知道第一个换行符的模式空间中的文本,

               并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间

               不包含换行符,则会像发出d命令那样启动正常的新循环

 

        H h为存 G g 为取  如没有存,则取为空行

        

                    

示例:

        sed -n 'n;p'file       打印偶数行

        sed '1!G;h;$!d'               汉诺塔   倒序显示   相当于 tac

        sed 'N;D' file          只显示了最后一行相当于 sed -n '$p' f1

        sed '$!N;$!D' file    显示了最后两行

        sed '$!d' file          显示了最后一行

        sed 'G' file              每一行后都加上空行

        sed '/part/g' file     指定行替换为空行

        sed '/^$/d;G' file 删除空行之后每一行之后都加空行

        sed 'n;d' file           删除偶数行(只显示奇数行)

        sed 'n;n;d'      file   删除3的倍数行,从第3行开始

               sed '1~3d' file        从第1行开始,隔2行删除1行

               

        

        

        显示奇数行     

               seq 10 | sed '2~2d'

               seq 10 | sed -n '1~2p'

               seq 10 | sed 'n;d'

        

        显示偶数行

               seq 10 | sed '1~2d'

               seq 10 | sed -n '2~2p'

               seq 10 | sed -n 'n;p'

        

 

练习:

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

        字符

               cat /etc/grub2.cfg | sed -r 's/^[[:space:]]+(.*)$/\1/'

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

        的#和空白字符

               cat /etc/fatab |sed -r 's/^#[[:space:]]+(.*)$/\1/'

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

               cat /root/install.log | sed -r 's/.*/#&/'

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

               cat /etc/fstab |sed -r 's/^[^#].*/#&/'

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

               basename:

                     echo /etc/fstab |sed -r  's#.*/([^/]+/?)#\1#' 

               dirname

                     echo /etc/fstab |sed -r  's#^(.*/)\<.*#\1#'

        6. 利用sed 取出ifconfig命令中本机的ipv4地址

               ifconfig |sed -n -r '2s/.*inet\ (.*)\ netmask.*/\1/p'

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

        字段的重复次数

               ls |sed -r 's/.*\.([^.]+)\.rpm/\1/' |sort|uniq -c|sort -nr

        8.统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep

        和sed两种方法分别实现)

        sed方式:

               cat /etc/init.d/functions|sed -r 's/[^[:alpha:]]/\n/g'|sed -r '/^$/d'|sed  -r '/^.$/d'|sort|uniq -c|sort -nr

                     总单词数:1747 (一个字母不算单词)

               cat /etc/init.d/functions|sed -r 's/[^[:alpha:]]/\n/g'|sed -r '/^$/d'|sed  -r '/^[^ai]$/d'|sort|uniq -c |sort -n        

                     总单词数:1774    除开a i 之外单字母不算单词

               cat /etc/init.d/functions|sed -r 's/[^[:alpha:]]/\n/g'|sed -r  '/^$/d'|sort|uniq -c |sort -n

                     总单词数:1994 单个字母也算单词       

        grep方式:

               cat /etc/init.d/functions|grep -Eoi '[[:alpha:]]+'|sort|uniq -c|sort  -n

                     总单词数:1994

               

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

               sed -n 'N;s/\n/ /' f1

               cat f1 |xargs -n2

 

               

               

笔记整理完成时间:2018年4月20日14:06:12

 

 


以上是关于第9章 文本处理工具sed的主要内容,如果未能解决你的问题,请参考以下文章

第十八章 文本处理流编辑器:sed命令

9.4-9.5 sed工具

sed多行文本处理

初识shell文本处理工具之gawk-sed

文本处理工具sed

linux学习-文本处理工具sed