sed
是一种流编辑器,用于在文本流中进行基本的文本转换。它可以用于对文件执行各种操作,如添加、删除、替换文本等。
基本用法:
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
常用选项:
-n
: 关闭自动打印模式-e
: 多点编辑-f
: 从文件中读取编辑命令-r
: 使用扩展正则表达式-i
: 直接修改文件内容
命令语法:
[address[,address]]function[arguments]
地址类型:
- 无地址:表示对全文进行处理
- 单地址:表示对指定行进行处理
- 范围地址:表示对指定范围行进行处理
- 特殊地址:如
/pattern/
,表示对匹配模式的行进行处理
常见函数:
a
: 在指定行后追加文本i
: 在指定行前插入文本d
: 删除指定行c
: 替换指定行s
: 替换指定文本,格式为s/old/new/
,可以添加选项如g
(全局)、n
(数字)、p
(打印)等。p
: 打印指定行=
: 打印行号y
: 字符转换q
: 退出sed
高级功能:
- 保持空间:
h
、H
、g
、G
等命令可以用来处理保持空间中的内容。 - 分支和循环:
b
、:label
、t
等命令可以用来实现分支和循环。 - 模式匹配:可以使用正则表达式进行复杂模式匹配。
- 从文件读取:
r
命令可以从其他文件中读取内容。 - 写入文件:
w
命令可以将内容写入到其他文件中。 - 多个文件编辑:可以一次性处理多个文件。
- 与其他命令的集成:可以将sed与管道、shell脚本等集成使用,实现复杂文本处理任务。
示例:
- 删除第5行:
- 打印第3到第7行:
- 在匹配模式的行前插入文本:
| sed '/pattern/i\insert text' filename |
- 全局替换:
| sed 's/old/new/g' filename |
- 从文件中读取编辑命令:
假设有一个名为commands.sed
的文件,其中包含一系列sed命令,可以这样执行:
| sed -f commands.sed filename |
- 直接修改文件内容:
要直接修改文件内容,而不是输出到标准输出,使用-i
选项:
| sed -i 's/old/new/g' filename |
- 多点编辑:使用
-e
选项可以进行多点编辑。例如:
| sed -e '1d' -e 's/old/new/' filename |
- 字符转换:使用
y
命令可以进行字符转换。例如,将小写字母转换为大写字母:
| sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' filename |
- 复杂的模式匹配与替换:可以结合正则表达式进行复杂的匹配与替换操作。例如,匹配以数字开头的行并替换某个模式:
| sed '/^[0-9]/ s/pattern/replace/' filename |
- 与其他命令集成:可以通过管道将sed与其他命令结合起来,实现更为复杂的文本处理任务。例如,使用find和sed来批量替换多个文件中的字符串:
| find . -name '*.txt' -exec sed -i 's/old/new/g' {} \; |