文本处理工具之sed

一.介绍

sed是一个流编辑工具,可以用来实现对文本的过滤与替换,而Linux的哲学思想之一就是一切皆文件,因此对文本的操作至关重要。sed的基本工作原理是通过每次读取一行文本来来对默写符合条件的文本进行处理。要注意的是sed默认并不直接修改源文件,而是将读取到的内容复制到缓冲区在中,这个缓冲区也叫做模式空间,然后在模式空间中对文本进行处理,处理完成后将结果输送到标砖输出。

二.sed的使用

1.使用格式:

sed [options] {script} [file]

常用的选项:

–help:获取帮助
-n,–quiet:使用静默模式,可以屏蔽自动打印功能
-e <script>:指定sed脚本
-f <file>:从指定的文件中获取指令
-i:直接对源文件进行处理
-r:在脚本中使用正则表达式

2.sed中的操作地址定界

number:指定要对哪个行进行处理

start~step:指定其实位置和步长,例如偶数行:2~2

/pattern/:pattern为正则表达式指定的模式
addr1,addr2:从addr1到addr2之间的所有行
addr1,+number:从addr1开始之后的number行
$:最后一行
add1,/pattern/:从addr1开始到pattern之间的所有行

3.sed中常用的指令

a:追加 s:替换
d:删除 i:插入
c:修改 p:打印
w:保存至指定文件中 !:条件取反

三.使用示例

测试文本为fstab

  1. 在第三行后面追加'hello'

sed '3a hello' fstab

2.在第三行之前插入'hello world'

sed '3i hello world' fstab

3.将所有#开头的行删除

sed '/^#/d' fstab

4.在所有以#开头的行后面添加新行'hello'

sed '/^#/a hello' fstab

5.删除所有空白行

sed '/^$/d' fstab

6.打印奇数行

sed -n '1~2p'fstab

7.将UUID修改为uuid

sed '/UUID/c uuid' fstab


四.sed脚本

当sed指令较长时,就可以将其写到一个文件中,sed脚本的基本格式是:

address{

command1

command2

}

执行脚本时:sed -f script source_file

  1. 使用示例:

找到文本中每行的第二个test,并将其该为test2

/test/{

s//test2/2

}

2.给所有的文本中所有的test添加“”

/test/{

s//"&"/g

}

3.读取多个文件

/.*/{

$r 1.sh

}

五.sed的高级应用

在一般情况下,sed处理的文本都是在一个叫做模式空间的缓冲区中,sed在执行命令时,这个空间就是用来保存待处理的文本,但sed还有另一个缓冲区域,这个区域叫做保持空间,当sed处理模式空间中的某些行时,可以用保持空间来临时存放一些行。sed的一些高级应用会涉及到保持空间。

1.next命令

n命令会移动到数据流的下一行。

例如:(1)在文本中找到hello所在的行,并将其后面的空白行删除

sed '/hello/{ n;d}' test

(2)打印偶数行

sed -n 'n;p' test

N命令会下一行添加到模式空间中已经存在的行的后面,

例如:(1)将hello所在行的后面一行合并到hello所在行

sed '/hello/{N;s/\n/ /}' test

(2)替换出现在相连行中的文本,例如替换下面文本中test1 file为test file:

this is a test1 

file , name is test

sed 'N;s/test1\nfile/test\nfile/' test

但是替换之后原本的两行内容会被合并成一行,于是解决办法就是使用两个替换命令来处理

sed 'N;s/test1\nfile/test\nfile/;s/test1 file/test file/' test

(有点难懂,多体会体会)

2.多行删除

D:只删除模式空间中的第一行

例如:当文本中有多个空白行,现在只删除第一个空白行,对于下面的文本,删除第一个空白行

this is a test1 

file , name is test

sed '/^$/;{N;/this/D}' test

3.关于保持空间中使用的命令

h:将模式空间中的内容复制到保持空间中
H: 把模式空间中的内容追加至保持空间中
g: 把保持空间中的内容复制到模式空间
G: 把保持空间中内容追加到模式空间中
x: 交换保持空间和模式空间中的内容

使用示例:将相连的两行调换位置

sed -n '{h;n;p;g;p}' test

解释:当第一行被加载到模式空间之中,h将这一行复制到保持空间,n会跳过这一行,打印下一行,然后g命令又会将第一行复制回来,然后打印,这样,相连的两行就会被调换顺序。

4.排除命令(!)

即排除符合条件的文本,例如不答应包含hello的行

sed '/hello/!p' test

逆序打印文本:

sed -n '{1!G;h;$p}' test

解释:当第一行被载入模式空间之后,h命令会把这一行复制到保持空间,知道模式空间中遇到最后一行才打印,当到最后一行时,保持空间中的顺序是4321,于是再将保持空间中的内容打印就是逆序输出了。

5.替换符号&

&可以用来引用替换命令中所匹配到的内容

例如:将文本中的hello都加上一个引号,注意这里的&替换的是整个模式匹配到的内容,不仅仅是一个单词,只是本例中恰好一个单词而已。

sed 's/hello/"&"/' test

6.替换单独的单词

可以使用圆括号()来定义替换模式中的子模式

例如:文本中有多个world,现在只需替换文本中hello world中的world为girl

sed 's/\(hello\) \(world\)/\1 girl/' test

这个使用方法十分诡异,我的理解是文本被载入到模式空间之后,原本的顺序会被颠倒。

7.加倍行距

例如:在每个文本的每个行后面添加一个空白行

sed 'G' test

解释:因为保持空间只有一个空白行,所以每次模式空间操作完成之后,G会把保持空间中的空白行复制到模式空间,于是再次打印就会在原文件的每个行后面添加一个空白行。

8.给文件中的行编号

sed '=' test | sed 'N;s/\n/ /'

常用的也就这些,关于sed的高级用法,会有些难以理解,如有理解错误的地方,请给予指正。

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

(0)
zhangbaozhangbao
上一篇 2017-01-05 17:13
下一篇 2017-01-05 21:29

相关推荐

  • DevOps如何重构IT战略

    翻译: 至尊宝 原文: http://www.citeworld.com/article/2897738/development/how-devops-can-redefine-your-it-strategy.html?page=2   DevOps究竟是昙花一现还是你一直在寻找的竞争优势?我们咨询了一些专家,对于这种趋势他们的想法是什…

    Python干货 2015-03-26
  • 8.1_Linux管道的使用和用户管理

    什么是管道? 管道就是把命令1的标准输出发送给命令2的标准输入,把命令2发的标准输出发送给命令3的标准输入。。。 最后一个命令会在当前shell进程的子shell进程中执行用来 管道实现了使用目的单一的小程序,组合小程序完成复杂的任务 管道需要配合其他命令的使用 tr命令的使用,常常用于配合管道     -c或–co…

    Linux干货 2016-08-10
  • 习题

    1.当用户xiaoming对/testdir 目录无执行权限时,意味着无法做哪些操作? 2.当用户xiaoqiang对/testdir 目录无读权限时,意味着无法做哪些操作? 3.当用户wangcai 对/testdir 目录无写权限时,该目录下的只读文件file1是否可修改和删除? 4.复制/etc/fstab文件到/var/tmp下,设置文件所有者为wa…

    Linux干货 2016-08-04
  • centos7或centos6中如何编译安装源码程序包

    yum仓库配置、程序的编译安装

    2017-12-02
  • 网络模型知识点概括

       网络模型分层 应用层 网络进程访问表示层 数据表示会话层 主机间通信传输层 端到端连接网络层 数据传输   数据链路层 访问介质物理层 物理线缆二进制封包与解封从下至上封包加包头通过上层协议传给对方机器,对方机器接受后需要从上至下拆解包头,这个过程叫解封三种通讯模式单播广播组播局域网:由服务器-》交换机-》pc …

    Linux干货 2017-05-02
  • HAproxy对wordpress的代理

    一,实验环境 网络拓扑结构 Web2,master是centos7.3 Web1,backup是centos6.8 客服端的window主机首win7 所有的主机通过switch相连,处于172.18.0.0/16的网段中 二,安装的软件 使用wordpress版本4.3.1 Web1安装httpd,php,php-mysql Web2安装nfs-utils…

    Linux干货 2017-05-17