sed与awk-第十二章-附录1sed快速参考
第十二章 附录1 sed 的快速参考
sed核心模型:模式空间(pattern space),读入一行放到模式空间,执行一系列编辑指令,最后输出;还有一块临时缓冲区叫保持空间(hold space),用于数据暂存。
命令行语法
sed两种调用方式
- 可以混合使用多次
‑e、‑f,命令会按顺序拼接执行。
常用选项
| 选项 | 说明 |
|---|---|
-n |
静默模式:只输出p命令、s替换p标记明确打印的行;关闭默认全部行输出 |
-e cmd |
指定一条编辑命令;多条命令时用 |
-f file |
从文件读取sed脚本 |
小技巧:sed脚本文件第一行写
#n,等价于命令行-n选项,开启静默模式。
sed命令通用语法
|
|
- 地址:用来筛选行;没有地址,命令对所有输入行生效。
!:取反,命令作用于不匹配该地址的行。- command:sed编辑指令。
重要:如果某条命令修改了模式空间内容,后续命令操作的是修改之后的模式空间内容,不是原始输入行。
模式寻址
地址两种形式:
- 行号:数字;
$代表最后一行。 - 正则模式:
/正则表达式/。
- 单个地址:命令作用匹配到的那一行。
- 两个地址用逗号隔开
addr1,addr2:地址范围,从匹配addr1行开始,一直到匹配addr2行结束,中间所有行全部命中。
注意:部分命令仅支持单个地址:
a、i、r、q、=,不能写范围。
大括号:多个命令绑定同一个地址
语法注意:左大括号必须在行末尾;右大括号必须单独占一行,右大括号后面不要加空格。
含义:匹配这个行范围,依次执行大括号内部多条命令。
sed正则表达式元字符 表A‑1
空正则
//:复用上一次使用的正则模式。
| 特殊字符 | 作用 | 示例 |
|---|---|---|
. |
匹配除换行以外任意单个字符 | a.b 匹配a任意字符b |
* |
匹配前面字符0次或多次 | ab*:a,ab,abb |
[...] |
字符集,匹配括号中任意一个字符;^放开头取反;‑表示范围 |
[0‑9]数字;[^a‑z]非小写字母 |
\{n,m\} |
次数限定;\{n\}恰好n次;\{n,\}至少n次;\{n,m\}n‑m次 |
a\{2,3\}匹配aa / aaa |
^ |
行开头(仅正则开头生效) | ^#匹配#开头行 |
$ |
行结尾(仅正则末尾生效) | ;$匹配分号结尾行 |
\ |
转义元字符,消除特殊含义 | \.匹配字面点号 |
\( \) |
捕获分组,保存匹配文本;最多9组,后续\1~\9反向引用 |
\(ab\)c |
\1 … \9 |
反向引用,引用\(\)捕获到的内容 |
s/\(a\)b/\1x/ → ab替换ax |
& |
在替换字符串中,代表整个完整匹配内容 | s/abc/(&)/ → abc变成(abc) |
sed全部命令汇总
区分:模式空间(主缓冲区);保持空间hold space(临时存储缓冲区)
标签与跳转
:label
设置标签,用于
b、t跳转;POSIX最多7字符,GNU sed无长度限制。
|
|
=
将匹配行的行号输出到stdout,不修改模式空间。
|
|
行插入、追加、修改
a\append 追加
在匹配行后面插入文本;多行文本每一行末尾要加反斜杠
\转义换行。
a插入的文本不会进入模式空间,后续sed命令无法处理插入内容,脚本结束直接输出。
i\insert 插入
在匹配行前面插入文本;多行同样需要末尾
\。
c\change 修改替换行
将匹配到的行(范围的话是整个范围)替换为给定文本;原模式空间清空,后续命令不会作用于替换后的文本。
删除类命令
ddelete
删除模式空间内容,当前行不再输出;立刻读取下一行,回到脚本最开头重新执行。
|
|
D
多行模式专用(配合N):删除模式空间内第一个换行符之前的内容;保留后面部分,回到脚本开头继续处理。
如果删除之后模式空间变空,行为等价d,读入新行。
保持空间 hold space(h H g G x)
hold space:独立临时缓冲区,初始是空。
h:把模式空间复制覆盖到保持空间,原有保持空间内容被清空覆盖。H:将换行符+模式空间内容追加到保持空间(不会清空旧内容)。g:把保持空间内容覆盖写回模式空间,模式空间原有内容丢掉。G:把换行符+保持空间内容追加到模式空间末尾;保持空间为空也会追加换行。xexchange:交换模式空间 和 保持空间 的全部内容。
读取下一行 n / N
n
输出当前模式空间;读取下一行,覆盖模式空间;继续执行n后面的命令,不跳回脚本开头。
N
多行拼接:读取下一行,在模式空间用
\n换行符把新旧两行拼接在一起;不会输出。构造多行模式空间,用于跨行匹配。
打印输出 p / P
pprint:打印整个模式空间。配合‑n静默模式使用。
|
|
P
多行模式N专用:只打印模式空间内第一个换行符前面那部分。没有N的情况下,P等价p。
退出 q
qquit
遇到匹配行就退出sed;匹配的行会先输出,再结束程序。
读到第 3 行,先输出当前这一行,然后执行q,直接退出程序
|
|
读取外部文件 r
r fileread
读取整个文件内容,追加到模式空间的后面;r和文件名之间要有空格。
|
|
替换 s
s/pattern/replacement/flags
在寻址行做替换。空模式
//代表复用上一个正则。 空模式//,只作用在s的【pattern 位置】
flags标记:
| flag | 说明 |
|---|---|
| 数字n | 只替换该行第n次匹配 |
g |
全局,替换该行全部匹配,不是仅第一个 |
p |
替换成功,则打印当前模式空间 |
w file |
替换成功,把当前行追加写入文件 |
示例
条件跳转 t
t label
如果前面发生过成功的s替换,就跳转到
:label标签;没有label跳到脚本末尾。
只检测替换是否成功,不检测模式匹配。
写文件 w
w file
将模式空间内容追加写入文件;w和文件名之间要有空格。脚本最多同时打开10个文件;文件不存在自动创建,多次w写入同一个文件是追加。
|
|
字符转换 y
y/src/dst/
按字符一一对应翻译,正则元字符无效,纯字面字符映射。
|
|
l 显示不可见字符
l(小写L L的L)
打印模式空间,把不可打印字符转成ASCII转义序列;长行自动折行。
|
|
输出示例:\t制表符、\b退格都是不可见控制字符;l命令会把它们输出成转义形式,方便肉眼查看。
无条件跳转 b
b label
无条件跳转到
:label标签;不写label直接跳到脚本末尾,后续命令全部跳过。
速记重点总结
-n静默模式,关闭默认输出,靠p打印需要的行。脚本第一行#n等效‑n。- 地址:
1,10行号范围;/a/,/b/模式范围;!取反;{}对同一地址执行多条命令。 a\ i\ c\插入/追加/修改行,插入文本不进模式空间。d删模式空间,读新行从头执行;D多行模式删第一部分。n输出当前行读下一行继续往下;N拼接多行到模式空间。p打印全部模式空间;P多行模式只打印第一行。- hold space保持空间:h/H存;g/G取回;x交换。
s///g替换;&代表全部匹配内容;\1‑\9捕获分组反向引用。b无条件跳转;t替换成功才跳转;:label定义标签。y///字符一对一翻译,不识别正则。r读外部文件追加;w把行写入文件。q直接退出sed。
区分容易混淆成对命令
命令 行为 h覆盖写入保持空间 g覆盖取回到模式空间 p打印全部模式空间 d清空模式空间,从头开始 n输出+读下一行继续往下执行
文章作者 会写代码的小郎中
上次更新 2011-08-11
许可协议 CC BY-NC-ND 4.0