Linux上文本处理三剑客之sed

文本处理工具sed

定义:

sed Stream EDitor ,又称行编辑器

sed是一种流编辑器,它一次只处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容输送到屏幕上,接着处理下一行,这样不断重复,知道文件末尾。文件内容并没有发生改变,除非你使用重定向存储输出。sed主要用来自动标记一个或多个文件,简化对文件的反复操作,编写转换程序等

用法:

Usage: sed [OPTION]... {script} [input-file]...


常用选项:

    -n :不输出模式空间内容的自动打印

    -e :多点编辑 比如: sed -e 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab

    -f /PATH/TO/SCRIPT_FILE :从指定文件中读取编辑脚本

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

    -i :原处编辑(警告:直接修改原文件)


地址定界:

1,空地址:对全文进行处理

2,单地址:

    # :指定行

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

3,地址范围

#,#

#,+#

#,/part1/

/part1/,/part2/

$:最后一行

4,步行:~

1~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 :显示替换成功的行


比如:


  •   sed -n '/^$/=' file  显示空行行号 

    blob.png 

  •   sed -n -e '/^$/p' –e '/^$/='  file 打印空白行并显示行号

    由于看不出效果,我加了一个参数 !,打印非空白行

    blob.png

  •   sed '/root/a\superma' /etc/passwd 在匹配到root行后插入

    blob.png

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

  •   sed '1,10d' file  删除1-10行 

  •   sed 's@var@rooterr@g' /etc/passwd 替换每行所有匹配到的字符

  •   sed -n 's@root@super&er@pg' /etc/passwd 全行替换root为rootroot---  &引用所匹配到的元素

    blob.png

  •   sed –i.bak 's/dog/cat/g' file  先创建备份,在执行操作



实战练习:

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

sed 's@^[[:space:]]\+@@' /etc/grub2.cfg


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

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


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

sed 's@^@#@' /etc/passwd


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

sed  -r 's@(^[^#])@#\1@' /etc/fstab  

sed 's@^[^#]@#&@' /etc/fstab


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

echo /etc/fstab/sadfsad/sdfsadf/aa  | sed -r 's@(.*/)([^/]+)\/?$@\1 \2@'

blob.png

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

ifconfig | sed -n  '2p' | sed -r 's@^[[:space:]]+inet[[:space:]]@@'|sed -r 's@[[:space:]].*@@' 

ifconfig| sed   -r -n  's@^[[:space:]]+inet[[:space:]](.*)net.*@\1@p'

blob.png


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

ls *.rpm | sed -r  's@.*\.(.*)\.rpm@\1@' | sort | uniq -c

blob.png


高级编辑命令


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

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

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

  • G :从保持空间中取出数据追加至模式空间中

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

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

  • N :追加匹配到的行的下一行至模式空间中

  • d :删除模式空间中的行

  • D :删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed命令


sed示例:

    

  • sed -n 'n;p' file  输出偶数行,相当于 sed -n '2~2p' file

  • sed '1!G;h;$!d' file  逆序输出 相当于tac命令

  • sed '$!N;$!D' file  只剩下后两行

  • sed '$!d' file  只剩下最后一行

  • sed 'G' file   每行后面追加一个空白行

  • sed '/^$/d;G' file  删除所有空白行,然后在每行后加一个空白行

  • sed -n '1!G;h;$p'  又是逆序输出

  • Linux上文本处理三剑客之sed已关闭评论
  • 1,387 views
    A+
发布日期:2016年08月08日  所属分类:linux
标签: