文本处理工具-2

1、 sed 是一种行/流编辑器,它一次处理一行内容;处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space ),接着用sed 命令处理缓冲区中该行内容,处理完成后,把缓冲区的该行内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出,Sed 可以用来自动编辑一个或多个文件。

2、 sed命令的用法(除非使用-i选项,不改变原文件内容)

1)、用法:sed [option]… 'script' inputfile…

2)、常用选项:

-n:不输出模式空间所有行的自动打印,而脚本命令p打印模式空间中被脚本指定地址的行,又因为sed命令本身就默认输出模式空间所有行的自动打印,所有-n选项和脚本命令p的同时使用就只打印模式空间中被脚本指定地址的行

     -e:多点编辑

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

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

     -i:原处编辑

    例如#sed –i ‘/^U/r /etc/issue’ fi,屏幕无打印显示,但是修改了原文件fi

    #sed –i ‘/^U/r /etc/issue’ fi

屏幕无打印显示,修改了原文件fi,但是在当前目录生成了fi原文件备份文件ffi.bak

3)、script(脚本)格式:'地址命令',必须同时包含地址和脚本命令,使用多个脚本命令,中间用;分开

script地址定界:

(1)不给地址:对全文进行处理(默认)

(2)单地址:

#:指定的行

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

(3)地址范围:

#,#:从第#行到第#行

#,+#

/pat1/,/pat2/

#,/pat1/

(4)步进:用符号~表示

1~2  奇数行

2~2  偶数行

script编辑命令/脚本命令:

d: 删除模式空间匹配的行,删除的模式空间处理行不再在屏幕上显示

p: 显示模式空间中的内容

a \text:在行后面追加文本;支持使用\n 实现多行追加

i \text:在行前面插入文本;支持使用\n 实现多行插入

c \text:替换为单行或多行文本

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

r /path/from/somefile:读取指定文件的文本至模式空间中匹配到的行后

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

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

例如#cat /etc/fstab > fi

#sed ‘3d’ fi,屏幕打印显示的fi文件内容的第三行被删除,但是fi文件本身没有改变

    #sed –n ‘3d’ fi,屏幕上无打印输出

    #sed ‘3,6p’ fi,屏幕打印显示且重复显示3-6行

    #sed –n ‘3,6p’ fi,屏幕打印显示3-6行

    #sed –n ‘1~2p’ fi,屏幕打印显示奇数行

    #sed –n ‘/^U/p’ fi,屏幕打印显示以U开头的行

    #sed ‘/^U/a \xxhhjjkk’ fi,屏幕打印显示且以U开头的行后新行追加文本xxhhjjkk

    #sed ‘/^U/a \xxhhjjkk\nbbccddee\nrtrt’ fi

屏幕打印显示且以U开头的行后分三行分别追加文本xxhhjjkk、bbccddee、rtrt

#sed ‘/^U/w /testdir/U.txt’ fi

 #sed  -n ‘/^U/w /testdir/U.txt’ fi, 把文件fi中以U开头的行存入文件/testdir/U.txt

#sed '/^U/=' fi,打印显示fi文件中以U开头的行的行号

#sed '/^U/!=' fi,打印显示fi文件中非以U开头的行的行号

4)、s///:查找替换, 支持使用其它分隔符,例如s@@@ ,s###

替换标记:

g:行内全局替换,如果不加g,则仅仅替代行中第一个模式匹配

p:显示替换成功的行

w  /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

ffi文件内容:good good good

              xxhhjjkk                              god god god  

例如#sed ‘s/good/god/gp’ ffi,屏幕打印输出结果是:god god god

                                                    xxhhjjkk

但是加上-n选项,输出结果就是:god god god 

    #sed ‘s/good/god/gw /root/fffi’ffi,将替换成功的行保存在文件/root/fffi中

                                                  

5)、示例:

#sed –n ‘2,/root/p’ /etc/passwd  打印显示第2行到第一个包含有root字符的行

#sed –n –e ‘/^$/p’ –e ‘/^$/=’ file 打印显示空行及相应的行号(不打印白行及相应行号)

#sed ‘/^$/d’ file 打印显示删除所有空行,但是原文件没有改变

#sed –n‘s/root/&superman/p’ /etc/passwd  ,第一个root字符串后添加superman

#sed –n‘s/root/superman&/p’ /etc/passwd  ,第一个root字符串前添加superman

#sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets,所有的dog字符串替换成cat字符串,同时

#sed –i.bak ‘s/dog/cat/g’ pets ,修改原文件时备份原文件为pets.bak

3、sed命令的高级编辑命令/高级脚本命令

1)、高级编辑命令:

其中模式空间相当于多工序加工车间,保持空间相当于临时仓储仓库

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

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

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

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

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

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

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

d: 删除模式空间中的行

D:删当前模式空间中的行

2)示例:

#sed -n 'n;p' FILE,只打印显示偶数行(不考虑n选项,起始自动读第一行进入模式空间,然后判断脚本命令n,读取匹配到的第一行的下一行第二行覆盖至模式空间,而后判断脚本命令p,默认打印第一行第二行同时再次打印第二行;接着读取第三行进入模式空间,然后判断脚本命令n,读取匹配到的第三行的下一行第四行覆盖至模式空间,而后判断脚本命令p,默认打印第三行第四行同时再次打印第四行;依次…;考虑n选项,默认打印不再输出,所以只打印输出偶数行)

   #sed '1!G;h;$!d' FILE,倒序排列,相当于#tac FILE(第一行不执行G,不是第一行就执行G,然后执行第二条命令h,最后一行不删除,不是最后一行就删除;起始自动读第一行进入模式空间,然后判断因为是第一行所以不执行G,接着执行第二条命令h,把模式空间中的第一行覆盖至保持空间,然后判断因为不是最后一行所以情况模式空间,也就不打印显示第一行;第二行进入模式空间…)

   #sed '$!N;$!D' FILE,只留最后两行,相当于#tail -2 FILE

   #sed '$!d' FILE, 只留最后一行,相当于#tail -1 FILE

   #sed ‘G’ FILE,在每行的后面加一空行

   #sed ‘g’ FILE,用空行覆盖每一行

   #sed ‘/^$/d;G’ FILE, 删除所有的空行,然后在每行后加一个空行

   #sed 'n;d' FILE打印显示奇数行

   #sed -n '1!G;h;$p' FILE倒序排列,相当于#tac FILE

 

原创文章,作者:18612763863,如若转载,请注明出处:http://www.178linux.com/31896

(0)
1861276386318612763863
上一篇 2016-08-15
下一篇 2016-08-15

相关推荐

  • Python基础篇之过程型程序设计

    一、Python过程型程序设计 面向过程 以指令为中心,由指令处理数据 如何组织代码解码问题 面向对象 以数据为中心,所有的处理代码都围绕数据展开 如何设计数据结构组织数据,并提供对此类数据所允许处理操作 简单方法: 1)、编译安装新版本至某特定路径 # yum install readline-devel # tar xf Python-2.7.6.tar…

    2018-01-11
  • ansible

    ansible 安装ansible 查看当前的系统版本 yum install redhat-lsb-core -y [root@localhost httpd]# lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: CentOS Description: C…

    Linux干货 2017-07-09
  • shell脚本编程

    一、编程基础: shell脚本是包含一些命令或声明,并符合一定格式的文本文件 shell脚本的用途有: 自动化常用命令 执行系统管理和故障排除 创建简单的应用程序 处理文本或文件 1)     第一步:使用文本编辑器来创建文本文件 script.sh 并编写内容 格式要求:首行shebang &nb…

    Linux干货 2016-08-15
  • 8.5_Linux文本处理工具和grep之正则表达式的使用

    Linux文本处理工具使用 文件查看工具的使用 cat 命令的使用  此命令一般用于查看文件内容比较多 NAME        cat – concatenate files and print on the&…

    Linux干货 2016-08-08
  • 马哥教育网络班21期+第9周课程练习

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash     #     nolog=`awk -F: '$…

    Linux干货 2016-09-19
  • 搭建简单的svn服务器

        svn在版本控制方面还是挺有用的。坑运维的人中就有研发,出补丁或版本的时候很坚定的说“升吧,没问题”,结果升上去后就会狂报错。所以运维的要在打补丁,尤其是改动很大的时候一定要把后路想好。否则会长时间的影响业务。svn就有一个很好的机制–回退(当然你也可以事先备份下),可以回退到之前的某个时间节点,操作很方便的。当然sv…

    Linux干货 2015-11-18