Mais conteúdo relacionado 5, sed3. 概述
• sed被称为流编辑器(stream editor), 它提供了一
种非交互式的方式(仅使用命令行)对输入的文
本内容进行编辑, 并将编辑后的文本输出到标
准输出. sed的输入可以来自: 文本文件, 管道或
者标准输入;
• sed不会修改输入文件的内容, 除非将输出结果
重定向到该文件; sed是基于正则表达式执行各
种文本操作命令的;
• 使用sed --version命令查看当前使用sed工具的
版本.
4. 工作过程
• sed是逐行对输入进行处理的, 以sed处理文本文件为
例, 以下是一个处理周期:
1, 读取文件的一行, 并保存在一个称为模式空间的内
存缓冲区中;
2, 如果指定了行范围, 则判断该行是否在该范围中.
如果在则执行sed命令, 不在则不执行sed命令;
3, 如果未指定行范围, 执行sed命令;
4, 如果未指定-n选项且模式空间没有清空, 打印模式
空间中的文本(可能经过处理也可能未处理).
注: 可以使用d指令清空模式空间.
sed在处理完所有的输入行之后, 退出程序. 可以看到
在整个处理过程中sed不会对文本文件进行写操
作, 而只是输出到标准输出.
5. 工作过程
- 示例
• 这里以一个示例文件和相关的命令演示sed的工作过程. textfile文件的
内容是以下三行:
abc
ddd
abc
命令: sed -n '1,2s/a/b/p' textfile
命令说明:
-n 默认不打印模式空间
1,2 行范围, 处理1-2行
s/a/b/p sed命令, 替换模式a为b, 然后打印
• 执行过程:
1, 读取第一行abc, 该行在范围1,2中, 执行命令s/a/b/p, 将替换后的字符串
bbc打印出来; 指定了-n选项不再打印;
2, 清空模式空间, 读取第二行ddd, 该行在范围1,2中, 执行命令, 没有发生
替换操作, 不打印; 指定-n选项, 不再打印;
3, 清空模式空间, 读取第三行abc, 不在范围1,2中, 不执行sed命令; 指定了
-n选项不打印.
命令最终的输出结果是: bbc
6. 基本用法
• 举几个简单的例子, 以便对sed这个工具有一些
初步的了解:
sed -n ‘/RE/p’ file # 打印匹配RE的行; sed在
处理完一行之后默认会打印该行, -n选项表示
不打印; 跟在/后面的p是sed指令, 表示打印.
sed -n ‘s/RE/string/p’ file # 对文件中包含RE的行
进行替换, 替换后打印该行; 没有进行替换的行
不打印.
7. sed命令
• sed支持对当前行的如下编辑命令(常用):
a 在当前行后面添加一行或多行
i 在当前行之前插入文本
c 用新文本修改(替换)当前行
d 删除行
p 打印行
n 读取下一行, 并从下一条命令开始处理该行
q 退出sed
r 从文件中读取输入行
! 对当前行之外的所有行执行命令
-----------------与暂存缓冲区相关-----------------
h 将模式空间内容复制到暂存缓冲区
H 将模式空间内容追加到暂存缓冲区
g 将暂存缓冲区内容复制到模式空间
G 将暂存缓冲区内容追加到模式空间
x 交换暂存缓冲区与模式空间内容
s 执行替换操作
与替换命令配合使用:
g 行内进行全局替换
p 打印行, 与s配合使用时仅在发生替换时才打印
w 将行写入文件
8. sed命令
-!
• 可以在命令前面加上”!”表示不执行该命令,
比如:
!d 不删除模式空间
!p 不打印
示例:
sed -n ‘/ab/!p’ textfile # 打印所有不匹配
模式的行
sed ‘/ab/!d’ textfile # 删除不匹配模式的行
9. sed选项
• sed命令可以指定如下选项:
-e 允许多项编辑
-f 指定sed脚本文件名称
-n 取消默认的输出
示例1:
sed -e '1,2d' -e 's/ab/d/' textfile
说明:
这里使用了-e选项进行多项编辑, 对读取的每一行, 先执
行命令‘1,2d’, 然后执行命令’s/ab/d/’.
示例2:
sed -n ‘/ab/p’ textfile
说明: 打印包含模式ab的行, 其他行不打印
11. 范围界定
• 范围界定是指界定需要进行编辑行的范
围, 可以是数字/正则表达式, 或者两者的组
合. 如果使用数字指定行号, 行号从1开始, $
符号表示最后一行. 如果没有指定范围, 那
么sed将会默认处理所有的行. 示例:
sed ‘1,3d’ textfile # 删除1-3行
sed -n ‘/west/,/north/p’ textfile # 打印从匹配
west开始到匹配north的行
12. sed元字符
• sed的正则表达式元字符与vi的十分类似, 不
同的地方是sed在进行替换时使用&字符代
表查找到的结果以便在替换串中引用, 示例:
sed -n 's/[a-z]+/&~/gp' textfile
说明:
在所有连续的小写字符串后面加上~符号.
• sed其他的元字符参考: 《3, Regular
Expression.pptx》
13. 正斜杠/
• 默认情况下sed使用正斜杠进行模式的匹配和
替换, 如果需要在模式中使用/字符, 那么需要
使用进行转义, 比如:
sed -n ‘/ab//p’ textfile # 打印匹配ab/模式的行
另一个解决方法是使用另外的字符作为模式标
识符, 使用char指定某个字符作为模式标识
符, 比如:
sed -n ‘#ab/#p’ textfile # 使用#代替/
• sed替换命令默认以s命令后的第一个字符作为
模式标识符, 此时不需要, 比如:
sed -n ‘s#ab#88#p’ textfile # 使用#代替/
14. 示例
• 以下是一些示例, 用于演示一些具体命令的使用:
1, p
p命令用于打印模式空间的内容, 通常与-n选项一起使用打印匹
配特定模式的行. 示例:
sed -n ‘/north/p’ textfile # 打印匹配north模式的行
2, d
d命令用于删除当前模式空间的内容, 这些行的内容不会被打印.
示例:
sed ‘1,3d’ textfile # 删除1-3行
sed ‘3,$d’ textfile # 删除3到最后一行
3, s
s命令用于替换操作, 示例:
sed ‘s/ab/c/’ textfile # 将第一个ab替换为c
sed ‘s/ab/c/g’ textfile # g表示将所有的ab替换为c
s命令与p命令, -n选项配合使用, 仅打印发生替换后的行, 示例:
sed -n ‘s/ab/c/gp’ textfile # 对包含ab模式的行进行替换并打印
15. 示例
4, 行范围
sed -n ‘2,3p’ textfile # 打印2-3行
sed -n ‘/west/,$p’ textfile # 打印匹配west行到最后一行
sed -n ‘5,/^north/p’ textfile # 打印第5行到匹配以north开
头的行
5, r
在处理完当前行之后(包括默认的打印), 打印文件内容.
示例:
sed ‘/ddd/r t2’ textfile # 打印匹配ddd的行之后, 输出t2
文件的内容
6, w
将当前文件的一些行写入到另一个文件, 示例:
sed -n ‘/ab/w newfile’ textfile # 将匹配ab的行写入newfile
中
16. 示例
7, a
追加, 在处理完当前行之后追加内容到标准输出, 示
例:
sed ‘/ddd/a hello’ textfile # 处理完包含ddd模式
的行之后, 输出 hello
8, i
插入, 在处理当前行之前打印内容到标准输出, 示例:
sed ‘/ddd/i hello’ textfile # 处理包含ddd模式的
行之前, 输出 hello
9, c
用指定的文本替换模式空间的文本, 并打印输出, 之
后处理下一行. 示例:
sed ‘/ddd/c hello’ textfile # 替换匹配模式的行
17. 示例
10, n
读取下一行, 之后的命令都会作用在下一行上面. 示例:
sed '/abc/{n;s/dd/gg/g}' textfile
说明:
如果读入的行不匹配模式abc, 不执行命令默认打印该行;
如果匹配, 打印该行之后读取下一行, 对下一行执行命令
s/dd/gg/g, 之后默认打印修改后的内容
11, y
转换命令, 比如y/abc/ABC/将abc分别转换为大写, 示例:
sed ‘1,3y/abc/ABC/’ textfile # 将1-3行的abc分别转换
为ABC
12, q
处理完指定行之后, 退出sed. 示例:
sed ‘/ddd/q’ textfile # 处理完匹配ddd的行之后退出命令
18. 暂存缓冲区
• 暂存缓冲区是模式空间之外的另一个缓冲区, sed提供了
相关的命令用于将模式空间的内容存储到暂存缓冲区
中:
h 将模式空间内容复制到暂存缓冲区
H 将模式空间内容追加到暂存缓冲区
g 将暂存缓冲区内容复制到模式空间
G 将暂存缓冲区内容追加到模式空间
x 交换暂存缓冲区与模式空间内容
• 示例:
sed -e '/abc/H' -e '$G' textfile
读取一行, 如果匹配abc模式追加到暂存区, 如果当前是
最后一行则将暂存区的内容追加到模式空间; 最后打印
模式空间的内容.
sed -e '/abc/H' -e '$x' textfile
与上例不同的是, 如果是最后一行交换暂存区与模式空