文本处理工具-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)
上一篇 2016-08-15 09:24
下一篇 2016-08-15 09:24

相关推荐

  • linux网络命令与软件管理

    1、描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景和区别 网桥也叫桥接器,是连接两个局域网的一种存储/转发设备,用来连接不同网段。 集线器称为“Hub”,主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。 二层交换机工作于OSI模型的第2层(数据链路层),可识别数据包中的MAC地址信息,…

    Linux干货 2016-12-18
  • Linux命令帮助及history命令的使用

    1.Linux命令帮助的获取详解 在Linux中获取命令帮助时,内部命令和外部命令的获取方式是有区别的: 即 (1)内部命令:#help COMMAND             #man bash     (2)外部命令:<1> # COMMAND –help &nb…

    Linux干货 2016-08-05
  • 第四周作业新

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 ]# cp -r /etc/skel /home/tuser1             &nb…

    2017-02-20
  • 马哥教育网络班22期第二周课程练习1-未闻花名

    1、Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找某字符 cp 复制文件 touch 创建文件 mv 移动文件 rm 删除文件 rmdir 删除目录 1.1 pwd命令 该命令的英文解释为print working directory(打…

    Linux干货 2016-08-22
  • 用户管理

    用户管理 用户通过uid来识别,用户的uid是全局唯一,Linux用户分三大类: 用户类别可以分为 管理员 系统用户 普通用户 ——管理员的id为0,系统用户的id为1-499,一般用户的id为500- 组也是一样(centos6.9和centos7.3 id编号有所不同)上述是centos6.9的id编号。 管理员账户:root,可…

    2017-06-01
  • Linux磁盘和文件系统管理进阶(swap、磁盘配额、RAID、LVM、btrfs)

    概述:     上篇已经介绍了一些磁盘和文件系统管理的基础概念,对磁盘的硬件构造,文件系统的基础概念部分有了一个大致的了解。本篇就分享一些关于磁盘和文件系统管理的一些高级应用,具体包含:     1、swap交换分区的管理     2、挂载…

    Linux干货 2016-08-30