sed使用简单,我们可以提供sed命令直接在命令行或具有sed命令的文本文件的形式。本教程讲解调用sed的例子,有这两种方法:

Sed 命令行

以下是我们可以指定单引号在命令行sed命令的格式如下:

sed [-n] [-e] 'command(s)' files

例子

考虑一下我们有一个文本文件books.txt待处理,它有以下内容:

1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864

首先,让我们不带任何命令使用sed文件的完整显示内容如下:

[jerry]$ sed '' books.txt

执行上面的代码,会得到如下结果:

1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864

现在,我们从上述文件中显示将看到sed的delete命令删除某些行。让我们删除了第一,第二和第五行。在这里,要删除给定的三行,我们已经指定了三个单独的命令带有-e选项。

[jerry]$ sed -e '1d' -e '2d' -e '5d' books.txt

执行上面的代码,会得到如下结果:

3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
6) A Game of Thrones, George R. R. Martin, 864

sed脚本文件

下面是第二种形式,我们可以提供一个sed脚本文件sed命令:

sed [-n] -f scriptfile files

首先,创建一个包含在一个单独的行的文本commands.txt文件,每次一行为每个sed命令,如下图所示:

1d
2d
5d

现在,我们可以指示sed从文本文件中读取指令和执行操作。这里,我们实现相同的结果,如图在上述的例子。

[jerry]$ sed -f commands.txt books.txt

执行上面的代码,会得到如下结果:

3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
6) A Game of Thrones,George R. R. Martin, 864

sed标准选项

sed支持可从命令行提供下列标准选择。

-n 选项

这是模式缓冲区的缺省打印选项。 GNU sed解释器提供--quiet,--silent选项作为 -n选项的替代。

例如,下面 sed 命令不显示任何输出:

[jerry]$ sed -n '' quote.txt

-e 选项

-e选项的编辑选项。通过使用此选项,可以指定多个命令。例如,下面 sed 命令打印每行两次:

[jerry]$ sed -e '' -e 'p' quote.txt

执行上面的代码,会得到如下结果:

There is only one thing that makes a dream impossible to achieve: the fear of failure.
There is only one thing that makes a dream impossible to achieve: the fear of failure. - Paulo Coelho, The Alchemist - Paulo Coelho, The Alchemist

-f 选项

-f选项是用来提供包含sed命令的文件。例如,我们可以按如下方法通过文件指定一个打印命令:

[jerry]$ echo "p" > commands.txt
[jerry]$ sed -n -f commands quote.txt

执行上面的代码,会得到如下结果:

There is only one thing that makes a dream impossible to achieve: the fear of failure. - Paulo Coelho, The Alchemist

像其他的编程语言,sed还提供了一个循环和分支工具来控制程序的执行流程。本教程将探讨如何使用sed的循环和分支。

sed循环的工作原理类似于现代编程语言中的goto语句。 sed可以跳转到标记标签的行并继续执行下面提供该标签的剩余命令。

以下是对在sed定义一个标签的语法。在这里,冒号后的名称(:)暗示的标签名称。

:label
:start
:end
:up

要跳转到一个特定的标签,我们可以使用 b 命令后面跟标签名称。如果标签的名称省略,则 sed 跳转到 sed 文件的末尾。

考虑一下我们有一个待处理文本文件books.txt ,它有以下内容:

A Storm of Swords
George R. R. Martin
The Two Towers
J. R. R. Tolkien
The Alchemist
Paulo Coelho
The Fellowship of the Ring
J. R. R. Tolkien
The Pilgrimage
Paulo Coelho
A Game of Thrones
George R. R. Martin

下面的例子是连接书名,并在一行用逗号分隔作者姓名。然后,它会搜索模式“Paulo”。如果能够匹配,它打印一个连字符(- )在该行的前面,否则跳转到打印行打印标签。

[jerry]$ sed -n '
h;n;H;x
s/\n/, /
/Paulo/!b Print
s/^/- /
:Print
p' books.txt

执行上面的代码,会得到如下结果:

A Storm of Swords, George R. R. Martin
The Two Towers, J. R. R. Tolkien
- The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
- The Pilgrimage, Paulo Coelho
A Game of Thrones, George R. R. Martin

初看起来,上面的脚本可能看起来神秘。让我们看看这是什么情况。

  • 最初sed读入模式缓冲区第一行即书名和保持缓冲区保持为空。后执行-h命令模式缓冲区被复制到保留缓冲区。现在,这两个缓冲区包含了本书即标题. A Storm of Swords. 接下来n命令打印当前的模式缓冲区(在本例中没有打印出来,因为-n选项),清除当前图形缓冲区读取输入的下一行。现在模式缓冲区包含George R. R. Martin。

  • 第三个命令跳到仅当模式不匹配,否则取代是由第四指令执行的标签Print。

  • :Print 仅仅是一个标签名,p是打印命令。

为了提高可读性,每个sed命令被放置在一个单独的行。然而,人们可以选择将所有命令在一行中,如下所示:

[jerry]$ sed -n 'h;n;H;x;s/\n/, /;/Paulo/!b Print; s/^/- /; :Print;p' books.txt 

执行上面的代码,会得到如下结果:

A Storm of Swords, George R. R. Martin
The Two Towers, J. R. R. Tolkien
- The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
- The Pilgrimage, Paulo Coelho
A Game of Thrones, George R. R. Martin

可以用t命令创建分支。 t 命令跳转到标签,只有在以前的替换命令是成功的。让我们以前面的章节同样的例子,但不是打印一个连字符(- ),现在我们印刷四连字符。下面的例子演示了 t 命令的用法。

[jerry]$ sed -n '
h;n;H;x
s/\n/, /
:Loop
/Paulo/s/^/-/
/----/!t Loop
p' books.txt 

当执行上面的代码,就会产生下面的结果。

A Storm of Swords, George R. R. Martin
The Two Towers, J. R. R. Tolkien
----The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
----The Pilgrimage, Paulo Coelho
A Game of Thrones, George R. R. Martin

我们已经讨论了在前面的章节中的第一个命令。第三个命令定义一个标签循环。第四命令上前置的连字符( - ),如果该行包含字符串“Paulo”和t命令重复这一过程,直到有四个连字符位于行的开头。

为了提高可读性,每个 sed 命令写在一个单独的行。否则,我们可以写一行一个 sed 如下:

[jerry]$ sed -n 'h;n;H;x; s/\n/, /; :Loop;/Paulo/s/^/-/; /----/!t Loop; p' books.txt 

当执行上面的代码,就会产生下面的结果。

A Storm of Swords, George R. R. Martin
The Two Towers, J. R. R. Tolkien
----The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
----The Pilgrimage, Paulo Coelho
A Game of Thrones, George R. R. Martin

from: http://www.yiibai.com/sed/sed_useful_recipes.html

Sed教程(二):基本语法、循环、分支相关推荐

  1. 一天学完spark的Scala基础语法教程二、运算符与分支语句(idea版本)

  2. 正则表达式--教程二(语法)

    正则表达式--教程一 简介(共三篇):https://blog.csdn.net/alzzw/article/details/99463959 正则表达式--教程三(匹配规则及示例):https:// ...

  3. React教程(二)——jsx语法、条件渲染、列表渲染

    1.JSX 语法 在react中,就是使用jsx的语法,来实现DOM元素的展示.一个基本的jsx语法的react模板如下: <div>{this.props.title}</div& ...

  4. oracle sql循环判断语句怎么写,Oracle 非常详细的 PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理...

    PL/SQL入门教程目录 Oracle PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理 一.PL/SQL简介 1.PL/SQL简介 1.PL/SQl是过程语言PL与结构化语言 ...

  5. 【MATLAB】流程控制 ( 循环结构 | for 循环 | while 循环 | 分支结构 | if end 分支结构 | if else end 分支结构 | switch case 分支结构 )

    文章目录 一.MATLAB 流程控制结构 二.for 循环 1.for 循环 2.嵌套 for 循环 三.while 循环 二.分支结构 1.if end 分支结构 2.if else end 分支结 ...

  6. 学习Kotlin(二)基本语法

    推荐阅读: 学习Kotlin(一)为什么使用Kotlin 学习Kotlin(二)基本语法 学习Kotlin(三)类和接口 学习Kotlin(四)对象与泛型 学习Kotlin(五)函数与Lambda表达 ...

  7. 动画骨骼【Visual C++】游戏开发五十二 浅墨DirectX教程二十 骨骼动画来袭(一)...

    间时紧张,先记一笔,后续优化与完善. 本系列文章由zhmxy555(毛星云)编写,载转请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/detail ...

  8. 【Visual C++】游戏开发五十二 浅墨DirectX教程二十 骨骼动画来袭(一)

    这是答应大家的讲解骨骼动画的文章的N部曲的第二篇.这篇文章里,我们对现行的三种模型动画技术进行了概述,然后对X文件构成进行了详细的剖析,最后放出了骨骼动画的第一个示例程序,载入了<诛仙>中 ...

  9. 【Visual C++】游戏开发五十二 浅墨DirectX教程二十 骨骼动画来袭(一)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8832812 作者:毛星云(浅墨 ...

最新文章

  1. java中实现将十六进制按位取反
  2. 如果编程语言是女人(译)
  3. LeetCode 1708. 长度为 K 的最大子数组
  4. python科学坐标图绘制的四个要素_Python3.0科学计算学习之绘图(四)
  5. 汇编 align_从零开始自制操作系统(5):实模式汇编(二)
  6. BCS冬奥主题活动日:奥运网络安全成全球关注焦点
  7. eclipse JSP页面中的JS代码为黑色,JS单独文件是OK的
  8. 目的路径太长如哈删除_如何清除winrar中的目标路径记录
  9. 软件开发项目计划书编写说明
  10. 10天手敲一个SpringBoot网上商城项目(五)——收货地址列表展示功能及设置默认收货地址功能的实现
  11. weico.android批量转发,运行更稳定 Weico Android正式版发布
  12. CSS - 知识清单(自用)
  13. python绘制三维地形_三维数字场地模型(上篇):Civil3D 地形的生成
  14. iphone11右上角信号显示_原来,iOS 11移动信号图标里竟然隐藏着 iPhone 8的巨大秘密...
  15. xshell安装及使用
  16. [IDA Plugin] IDA插件收集
  17. 网关,路由,局域网内的通信及不同的网络间通信实现的原理剖析
  18. 小米盒子4刷入armbian系统后的网络设置
  19. 安卓10源码开发定制(23)内核系统调用openat Hook研究测试
  20. 删除文件名含有特殊字符的文件时的意外发现

热门文章

  1. 人脸识别技术大总结—Face Detection Alignment
  2. 白话Elasticsearch65-最少master候选节点以及ES集群脑裂问题
  3. Linux-pidstat Monitor and Find Statistics for Linux Procesess
  4. Linux-grep命令
  5. RocketMQ:NameServer路由管理源码分析
  6. 系统优化怎么做-数据库优化
  7. 在python下实现ssh出现错误:ModuleNotFoundError: No module named ‘cryptography‘
  8. mysql数据迁移到teradata_Mysql迁移到达梦数据库-Mysql到DM的应用迁移-给自增列赋值-GroupBy语法不兼容...
  9. 应用程序池超出其作业限制设置_网站改版注意事项 - 蜘蛛池
  10. 22个超详细的 JS 数组方法