本文共 2948 字,大约阅读时间需要 9 分钟。
sed
术语上一节讲了sed
的一些基础概念,包括命令的结构,底层工作原理等;这一节我们来看一下三个重要的sed
术语,以及常见的使用方式。
上节课讲到,一般sed
命令满足这样一个格式
[ADDR]X[OPTIONS]
其中[ADDR]
的部分就是地址规范部分,注意这里用中括号的原因是因为地址规范是可选参数,并不是必须参数(mandatory)。下面是一些例子,假设要处理的文件名为example.txt
,内容如下:
abc123abc1234abc12345abc123456
命令如下:
sed -n 2p example.txt
-n
是禁止默认的打印(第二节课提到过,sed
默认会向屏幕打印结果)2p
是手动打印第二行的意思 p
是sed
命令格式[ADDR]X[OPTIONS]
中的X
部分,即单个字母代表的某一种函数p
代表print
(打印)输出:
abc1234
命令如下:
sed -n 2,4p example.txt
使用范围时,用逗号,
隔开起始行和终点行
输出:
abc1234abc12345abc123456
命令如下:
sed -n 2~2p example.txt
Offset
)是2
,也就是从第二行开始算Interval
)是2
,也就是每两行打印一次Slicing
)语法有点像:list[1::2]
输出:
abc1234abc123456
命令如下:
sed -n '2,$p' example.txt
$
是代表文件结尾行,当你不知道总行数的时候可以这么用;这里需要加上引号,不然$
会被误读
输出:
abc1234abc12345abc123456
命令如下:
sed -n 2,+1p example.txt
这里+1
的意思就是代表后面一行,+9
就是后面9行,以此类推
输出:
abc1234abc12345
我们之前讲到,sed
的底层工作原理是逐行进行编辑,形成循环;模式空间就是用于存储每一行编辑后的结果。默认情况下,每一行编辑结束后,下一行开始编辑之前,sed
会向屏幕打印出模式空间的内容,紧接着情况模式空间;当然我们可以用-n
禁止默认的打印。
这里做一个简单的总结,模式空间:
顾名思义,用于保持特定内容的空间。其作用与模式空间相对,模式空间在每一行的编辑结束后会被清空,但是保持空间会将其中的内容一直保存下去,直到被特定命令/函数调整。
命令如下:
sed -e '{H;g}' example.txt
H
:在保持空间中加一行空行,然后把模式空间的内容追加append
到保持空间g
:用保持空间的内容替换模式空间的内容输出:
abc123abc123abc1234abc123abc1234abc12345abc123abc1234abc12345abc123456
如果我们开启调试--debug
模式
sed -e '{H;g}' example.txt --debug
就会看到PATTERN
和HOLD
中的具体内容
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/