博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
流编辑器sed的系统性讲解 - 第三节(共七节)- 地址规范(Address Specification),模式空间(Pattern Space),保持空间(Hold Space)
阅读量:4195 次
发布时间:2019-05-26

本文共 2948 字,大约阅读时间需要 9 分钟。

sed术语

上一节讲了sed的一些基础概念,包括命令的结构,底层工作原理等;这一节我们来看一下三个重要的sed术语,以及常见的使用方式。

a. 地址规范 (Address Specification)

上节课讲到,一般sed命令满足这样一个格式

[ADDR]X[OPTIONS]

其中[ADDR]的部分就是地址规范部分,注意这里用中括号的原因是因为地址规范是可选参数,并不是必须参数(mandatory)。下面是一些例子,假设要处理的文件名为example.txt,内容如下:

abc123abc1234abc12345abc123456

1. 打印第2行(某一行)

命令如下:

sed -n 2p example.txt
  • 这里的-n是禁止默认的打印(第二节课提到过,sed默认会向屏幕打印结果)
  • 2p是手动打印第二行的意思
    • 这里的psed命令格式[ADDR]X[OPTIONS]中的X部分,即单个字母代表的某一种函数
    • 这里p代表print(打印)

输出:

abc1234

2. 打印第2至4行(范围)

命令如下:

sed -n 2,4p example.txt

使用范围时,用逗号,隔开起始行和终点行

输出:

abc1234abc12345abc123456

3. 从第二行开始,每隔两行打印一次(偏移&间隔)

命令如下:

sed -n 2~2p example.txt
  • 这里偏移量(Offset)是2,也就是从第二行开始算
  • 间隔(Interval)是2,也就是每两行打印一次
  • 有没有发现这个语法和Python中的列表切割(Slicing)语法有点像:list[1::2]

输出:

abc1234abc123456

4. 打印第二行到最后一行

命令如下:

sed -n '2,$p' example.txt

$是代表文件结尾行,当你不知道总行数的时候可以这么用;这里需要加上引号,不然$会被误读

输出:

abc1234abc12345abc123456

5. 打印第二行和它后面一行

命令如下:

sed -n 2,+1p example.txt

这里+1的意思就是代表后面一行,+9就是后面9行,以此类推

输出:

abc1234abc12345

b. 模式空间 (Pattern Space)

我们之前讲到,sed的底层工作原理是逐行进行编辑,形成循环;模式空间就是用于存储每一行编辑后的结果。默认情况下,每一行编辑结束后,下一行开始编辑之前,sed会向屏幕打印出模式空间的内容,紧接着情况模式空间;当然我们可以用-n禁止默认的打印。

这里做一个简单的总结,模式空间

  • 用于存储每一行编辑后的结果
  • 每一行编辑完成后会打印模式空间中的内容
  • 接着会清空模式空间

c. 保持空间 (Hold Space)

顾名思义,用于保持特定内容的空间。其作用与模式空间相对,模式空间在每一行的编辑结束后会被清空,但是保持空间会将其中的内容一直保存下去,直到被特定命令/函数调整。

打印1,2,…,n行(金字塔形)

命令如下:

sed -e '{H;g}' example.txt
  • H:在保持空间中加一行空行,然后把模式空间的内容追加append保持空间
  • g:用保持空间的内容替换模式空间的内容

输出:

abc123abc123abc1234abc123abc1234abc12345abc123abc1234abc12345abc123456

如果我们开启调试--debug模式

sed -e '{H;g}' example.txt --debug

就会看到PATTERNHOLD中的具体内容

SED PROGRAM:                   # sed的命令  {
H g }INPUT: 'example.txt' line 1 # 第一行编辑开始PATTERN: abc123 # 因为没有任何的编辑,因此模式空间中的内容就是第一行的内容COMMAND: {
COMMAND: HHOLD: \nabc123 # H命令之后,保持空间有了空行+模式空间的内容COMMAND: gHOLD: \nabc123 # g命令之后,保持空间没有变化,COMMAND: } # 但是此时模式空间以及等同于保持空间(尽管没有显示模式空间)END-OF-CYCLE:abc123 # 第一行结束后,打印`\nabc123`,空行+abc123INPUT: 'example.txt' line 2 # 第二行编辑开始,过程与上面雷同PATTERN: abc1234COMMAND: {
COMMAND: HHOLD: \nabc123\nabc1234COMMAND: gHOLD: \nabc123\nabc1234COMMAND: }END-OF-CYCLE:abc123abc1234INPUT: 'example.txt' line 3PATTERN: abc12345COMMAND: {
COMMAND: HHOLD: \nabc123\nabc1234\nabc12345COMMAND: gHOLD: \nabc123\nabc1234\nabc12345COMMAND: }END-OF-CYCLE:abc123abc1234abc12345INPUT: 'example.txt' line 4PATTERN: abc123456COMMAND: {
COMMAND: HHOLD: \nabc123\nabc1234\nabc12345\nabc123456COMMAND: gHOLD: \nabc123\nabc1234\nabc12345\nabc123456COMMAND: }END-OF-CYCLE:abc123abc1234abc12345abc123456

相比之下,模式空间似乎更基础也更重要一些,保持空间从某种角度说,是为更高级的命令、操作而设计的;甚至一些人建议,不要刻意使用保持空间,或者当你需要用到保持空间的时候,也就是你需要用其他语言、工具(比如awk)替代sed的时候。

如果你问我保存空间到底有什么实际作用,我想说,与其去发明、发掘保存空间的用法,不如记住/保存下一些常用的相关命令清单,用的时候直接复制粘贴就好。之后的文章我会尽量做一些有关保存空间用法的总结。如果有需要就直接拿去用。自己去发掘保存空间的用法,虽然很酷,但是时间和回报并不成正比,也是我并不推荐的sed的使用方法之一。

总结一下

  • 地址规范:用于定位特定行,以进行相应操作
  • 模式空间:用于临时保存每行处理后的结果(每轮编辑后会被清空)
  • 保存空间:用于长期保存特定内容(内容不会在每轮结束后被清空,除非使用特定的函数/命令)

下一节课sed脚本,多行命令和分组

转载地址:http://lqgoi.baihongyu.com/

你可能感兴趣的文章
“苹果皮”与知识产权
查看>>
发挥你的SATA硬盘
查看>>
程序解读身份证的密码
查看>>
显卡性能排行榜
查看>>
手机操作系统发展史
查看>>
REST WebService与SOAP WebService的比较
查看>>
数据库迁移
查看>>
数学学科--读到硕士也只是学了皮毛
查看>>
MySQL大小写问题
查看>>
企业级系统架构的理解
查看>>
四大类NoSQL数据库
查看>>
新浪微博XSS攻击事件
查看>>
Eclipse REST 库使用
查看>>
页面的兼容性从认识<!DOCTYPE>开始
查看>>
数字图像处理--空间变换
查看>>
安装制作不用愁—Wise installation入门教程
查看>>
两个程序员的泰国普吉岛之行
查看>>
常见流媒体协议
查看>>
SQL group by的困惑
查看>>
用wifi调试android程序
查看>>