简单描述
功能:sed --> Stream Editor 主要用来自动编辑一个或多个文件,简化对文件的反复操作(非交互流编辑器)
作用:按行处理,先将一行内容读入到"模式空间(Pattern space)"进行相关代码处理,最后在输出到屏幕
空间:两种空间 "模式空间(Pattern space)" <==> "保持空间(Holding space)" 他们之间的内容可以使用指令相互转换,初始时内容都为空
sed 由一个或多个sed命令组成,因此被称为sed程序
sed 可以理解为是一个双层for循环,第一次循环是读取每一行,第二次循环是针对每一行进行单独处理
sed 已经读取过的行无法再次被读取,所以sed不提供往回取数据的表达式
sed 在读取数据到"模式空间"内不会把对应的换行符加入"\n",只有在做其他处理(比如:p打印)等操作时才会在末尾进行输出"\n"
操作流程
1、首先读取一行到"模式空间"
2、在"模式空间"中执行命令,如果使用了{}或-e指定了多个命令,sed将依次执行每个命令
3、打印"模式空间"的内容,然后清空"模式空间"
4、重复上述过程,直到文件结束
两种空间
注意:"追加"的原理,先在当前空间的尾部追加一个换行符"\n",最后在将空间内的值追加到换行符尾部
x 将"模式空间"和"保持空间"中的内容"交换" Ps <==> Hs
h 将"模式空间"中的内容"覆盖"到"保持空间" Ps ==> Hs
H 将"模式空间"中的内容"追加"到"保持空间",内容之间使用\n Ps ==>> Hs
g 将"保持空间"中的内容"覆盖"到"模式空间" Hs ==> Ps
G 将"保持空间"中的内容"追加"到"模式空间",内容之间使用\n Hs ==>> Ps
基本用法
sed [options] 'command' file
1、选项(options)
短选项 | 长选项 | 描述 |
-c | --copy | (常用)该选项应和-i配合使用;使用-i时,通常在命令执行完成后,sed使用临时文件来保持更改后的内容,然后把该临时文件重命名为输入文件;但这样会改变文件的所有者或文件权限,配合c选项,可以保持文件所有者或权限不变 |
-e | --expression= | (常用)允许多个命令同时顺序编辑 |
-n | --quiet、--silent | (常用)取消默认输出 |
-r | --regexp-extended | (常用)启用扩展正则表达式 |
-i[bak] | --in-place[=bak] | (常用)直接修改读取的文件内容,而不是由屏幕输出,[bak]可以在修改前备份原文件 |
-s | --separate | (常用)将输入文件视为各个独立的文件而不是一个长的连续输入,每个文件行号都将被重置 |
-f s.sed | --file=s.sed | 从指定文件内输入sed参数 |
-h | 显示命令行选项列表(帮助文档) | |
-l N | --line-length=N | 指定"l"命令的换行期望长度(N=0意味着完全不换行的长行,如果不指定,则70个字符就换行) |
--posix | 关闭所有 GNU 扩展 | |
--help | 输出sed命令行的简单帮助信息并退出 | |
-u | --unbuffered | 使用尽量少的空间缓冲输入和输出行 |
-V | --version | 打印版本和版权信息 |
-z | --null-data 、--zero-terminated | 以空串符号"\0"而不是换行符"\n"作为输入流的行分隔符 |
2、命令(command)
命令 | 描述 |
a | 新增 在当前行后面添加一行或多行文本 |
b | 跳转 无条件跳转到标签,如果标签省略则跳转到尾部继续进行下一个sed循环 |
c | 取代 使用新的文本改变本行的内容 |
d | 删除 删除"模式空间"中所有内容,并立即退出当前循环,即读取下一行 |
D | 删除 删除"模式空间"中第一个换行符\n之前的内容,开始下一次循环;删除之后"模式空间"内没有内容则退出循环进入下一个sed,如果还剩内容则继续从头执行循环,即D后面的命令不会被执行,默认也不会输出 |
e | 执行 表示执行命令 |
F | 输出 输出当前处理的输入流的文件名(需要sed4.2以上版本支持) |
g | 覆盖 将"保持空间"中的内容"覆盖"到"模式空间" |
G | 追加 将"保持空间"中的内容"追加"到"模式空间",内容之间使用\n |
h | 覆盖 将"模式空间"中的内容"覆盖"到"保持空间" |
H | 追加 将"模式空间"中的内容"追加"到"保持空间",内容之间使用\n |
i | 插入 在当前行上面插入一行或多行文本 |
l | 打印 以一种明确的方式打印"模式空间",显示特殊字符(类似cat -A 或者 cat -v显示的功能) |
L | 打印 忽略"模式空间"内的特殊字符(例如: 11\n22 输出 11 22) |
n | 读取 读取下一行内容"覆盖"当前"模式空间"内容 |
N | 读取 读取下一行内容"追加"到"模式空间"的尾部 |
p | 打印 打印"模式空间"里面的内容 |
P | 打印 打印"模式空间"中第一个换行符\n之前的内容 |
q | 退出 立即退出sed,使其不再执行后面的命令,可以指定退出状态码 q 10 |
Q | 退出 立即退出sed,使其不再执行后面的命令,可以指定退出状态码 Q 10 |
s | 替换 s/old/new/[gpIiMme]修饰符 |
t | 跳转 "s"命令替换"成功"则跳转到标签,如果标签省略则跳转到尾部继续进行下一个sed循环 |
T | 跳转 "s"命令替换"失败"则跳转到标签,如果标签省略则跳转到尾部继续进行下一个sed循环 |
v | 版本 指定sed脚本必须高于此版本的sed程序才能运行,默认指定的版本号是"4.0" |
x | 交换 将"模式空间"和"保持空间"中的内容"交换" |
y | 替换 字符一一替换,例如: y/abc/xyz/ 将a全部替换成x,将b全部替换成y,将c全部替换成z |
z | 清空 清空模式空间中的内容;内容清掉,变成一个空行 |
r file | 条件匹配后将文件file的所有内容读入到指定位置 |
R file | 条件匹配后将文件file的一行内容读入到指定位置 |
w file | 将匹配的结果输出到指定文件file中 |
W file | 将"模式空间"中第一个换行符\n之前的内容写入到文件file中 |