首先,应该明白模式空间的定义。模式空间就是读入行所在的缓存,sed对文本行进行的处理都是在这个缓存中进行的。这对接下来的学习是有帮助的。

在正常情况下,sed将待处理的行读入模式空间,脚本中的命令就一条接着一条的对该行进行处理,直到脚本执行完毕,然后该行被输出,模式空间请空;然后重复刚才的动作,文件中的新的一行被读入,直到文件处理完备。

但是,各种各样的原因,比如用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间得到保留以便下一次的处理,都有可能使得sed在处理文件的时候不按照正常的流程来进行。这个时候,sed设置了一些高级命令来满足用户的要求。

总的来说,这些命令可以划分为以下三类:

1. N、D、P:处理多行模式空间的问题;

2. H、h、G、g、x:将模式空间的内容放入存储空间以便接下来的编辑;

3. :、b、t:在脚本中实现分支与条件结构。

多行模式空间的处理:

由于正则表达式是面向行的,因此,如若某个词组一不分位于某行的结尾,另外一部分又在下一行的开始,这个时候用grep等命令来处理就相当的困难。然而,借助于sed的多行命令N、D、P,却可以轻易地完成这个任务。

多行Next(N)命令是相对于next(n)命令的,后者将模式空间中的内容输出,然后把下一行读入模式空间,但是脚本并不会转移到开始而是从当前的n 命令之后开始执行;而前者则保存原来模式空间中的内容,再把新的一行读入,两者之间依靠一个换行符"\n"来分隔。在N命令执行后,控制流将继续用N命令以后的命令对模式空间进行处理。

值得注意的是,在多行模式中,特殊字符"^"和"$"匹配的是模式空间的最开始与最末尾,而不是内嵌"\n"的开始与末尾。

例1:

$ cat expl.1

Consult Section 3.1 in the Owner and Operator

Guide for a description of the tape drives

available on your system.

现在要将"Owner and Operator Guide"替换为"Installation Guide":

$ sed '/Operator$/{

> N

> s/Owner and Operator\nGuide/Installation Guide\

> /

> }' expl.1

在上面的例子中要注意的是,行与行之间存在内嵌的换行符;另外在用于替代的内容中要插入换行符的话,要用如上的"\"的转义。

再看一个例子:

例2:

$ cat expl.2

Consult Section 3.1 in the Owner and Operator

Guide for a description of the tape drives

available on your system.

Look in the Owner and Operator Guide shipped with your system.

Two manuals are provided including the Owner and

Operator Guide and the User Guide.

The Owner and Operator Guide is shipped with your system.

$ sed 's/Owner and Operator Guide/Installation Guide/

> /Owner/{

> N

> s/ *\n/ /

> s/Owner and Operator Guide */Installation Guide\

> /

}' expl.2

结果得到:

Consult Section 3.1 in the Installation Guide

for a description of the tape drives

available on your system.

Look in the Installation Guide shipped with your system.

Two manuals are provided including the Installation Guide

and the User Guide.

The Installation Guide is shipped with your system.

看上去sed命令中作了两次替换是多余的。实际上,如果去掉第一次替换,再运行脚本,就会发现输出存在两个问题。一个是结果中最后一行不会被替换(在某些版本的sed中甚至不会被输出)。这是因为最后一行匹配了"Owner",执行N命令,但是已经到了文件末尾,某些版本就会直接打印这行再退出,而另外一些版本则是不作出打印立即退出。对于这个问题可以通过命令"$!N"来解决。这表示N命令对最后一行不起作用。另外一个问题是"look manuals"一段被拆为两行,而且与下一段的空行被删除了。这是因为内嵌的换行符被替换的结果。因此,sed中做两次替换一点也不是多余的。

例3:

$ cat expl.3

This is a test paragraph in Interleaf style ASCII. Another line

in a paragraph. Yet another.

v.1111111111111111111111100000000000000000001111111111111000000

100001000100100010001000001000000000000000000000000000000000000

000000

More lines of text to be found after the figure.

These lines should print.

我们的sed命令是这样的:

$ sed '/{

> N

> c\

> .LP

> }

> /

/,/

/{

> w fig.interleaf

> /

/i\

> .FG\

> \

> .FE

> d

> }

> /^$/d' expl.3

运行后得到的结果是:

.LP

This is a test paragraph in Interleaf style ASCII. Another line

in a paragraph. Yet another.

.FG

.FE

.LP

More lines of text to e found after the figure.

These lines should print.

之间的内容则写入文件"fig.interleaf"。值得注意的是命令"d"并不会影响命令i插入的内容。

命令"d"作用是删除模式空间的内容,然后读入新的行,sed脚本从头再次开始执行。而命令"D"的不同之处在于它删除的是直到第一个内嵌换行符为止的模式空间的一部分,但是不会读入新的行,脚本将回到开始对剩下内容进行处理。

例4:

$ cat expl.4

This line is followed by 1 blank line.

This line is followed by 2 blank line.

This line is followed by 3 blank line.

This line is followed by 4 blank line.

This is the end.

linux sed高级用法,sed 高级用法相关推荐

  1. sed基本用法 sed文本块处理 、 sed高级应用

    sed 文本编辑器(vim) 增,删,改,查 特色:流处理器[逐行处理的流处理器] 各种编辑器notepad,notepad++,word,atom vim,vi,gedit,sed 非交互的(sed ...

  2. Linux下 ls 命令的高级用法8例

    Linux下 ls 命令的高级用法8例 在Linux下,ls这个命令大家肯定太熟悉了,良许相信只要是Linux工程师,每天都会离不开这个命令,而且一天会使用个几百次.但是,除了 ls -l 以外,你还 ...

  3. linux中替换命令详解,linux中sed命令字符串替换的用法详解

    Linux系统中sed命令可以将字符串批量替换,省去了很多麻烦,下面由学习啦小编为大家整理了linux系统中sed命令字符串替换的用法详解,希望对大家有帮助! linux中sed命令字符串替换的用法详 ...

  4. linux sed命令_Linux sed命令用法与示例

    linux sed命令 Sed, short for Stream EDitor, is a command that is used to perform text transformations ...

  5. linux 大文件编辑sed,Linux高级文本处理工具之sed(一)

    sed:Stream Editor文本流编辑,sed是一个"非交互式的"面向字符流的编辑器.能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模 ...

  6. 1.10-linux三剑客之sed命令详解及用法

    内容: 1.sed命令介绍 2.语法格式,常用功能 查询  增加  替换 批量修改文件名 第1章 sed是什么 字符流编辑器 Stream Editor 第2章 sed功能与版本 处理出文本文件,日志 ...

  7. 【摘】Linux运维入门到高级全套常用要点

    Linux运维入门到高级全套常用要点 目 录 1. Linux 入门篇----------------------- 4 1. 1 Linux 操作系统简介-------------------.. ...

  8. Linux文本三剑客之sed仗剑走天涯

    一,sed是什么? sed是Strem Editor(流编辑器)缩写,是操作.过滤和转换文本内容的强大工具.对文件内容逐行(行编辑器,一行读取一次,对行编辑)进行处理调用操作并显示到STDOUT,常用 ...

  9. linux 编辑模式使用sed,sed命令的用法和vim编辑器的使用

    一.文本处理工具sed sed [option]-.'script] [input-file]- 简介: sed是一种流编辑器,他一次处理一行的内容,处理时把当前处理的行存储在临时缓冲区中,这个缓冲区 ...

最新文章

  1. live2d模型_使用二次元模型动画人物让自己网站“骚起来”
  2. MS/OR国际期刊排名
  3. Linux操作系统安装LAMP环境
  4. spring boot 整合多数据源JDBC、多数据源mybatis、多数据源springdata jpa
  5. ASP.NET中的数据绑定:哪个更快? (转)
  6. java消息分发_Kafka教程设计思想之消息分发策略
  7. GVRP:GARP VLAN 注册协议 - 802.1P、802.1Q (GARP VLAN Registration Protocol - 802.1P、802.1Q)...
  8. ROS最正确的限速--------小包优先+带宽均分+简单队列限制上传速度
  9. 精度,精确率,召回率_了解并记住精度和召回率
  10. 顽皮狗 多线程分享_谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!...
  11. 手机网页播放器php,html5手机移动端视频播放代码插件
  12. WAMP下解决localhost可以访问但IP地址无法访问的问题
  13. Python 开发工具集:关于文档、测试、调试、程序的优化和分析
  14. [转载] 解决AndroidStudio连不上Android设备真机的问题
  15. DeepL与有道翻译对比
  16. 基于区域生长算法的图像分割python_基于区域分割(图像分割)
  17. idea的英文是什么意思_intellij是什么意思
  18. 一款多核架构GPU IP有多达33种配置!Imagination要守住移动市场攻向云端
  19. os什么意思python_Python中import os是什么意思?
  20. PTA:输出较大或较小值(c++,函数模板)

热门文章

  1. 命令行运行Python脚本时传入参数的三种方式
  2. LLVM与Clang局部架构与语法分析
  3. 一些量化(quantization)技巧
  4. MindSpore后端运行类
  5. 画布Canvas的使用
  6. 客快物流大数据项目(十二):Docker的迁移与备份
  7. Android setOnItemClickListener cannot be used with a spinner
  8. Java 修饰符的总结
  9. 模拟文件上传(一):手动文件上传
  10. 御水.20180506