sed
是 Unix 和类 Unix 操作系统中一种强大的流编辑器(stream editor),用于处理和转换文本。它可以逐行处理输入流或文件中的文本数据,进行插入、删除、替换和其他复杂的文本操作。本文将详细介绍 sed
命令的基本用法、常见操作以及一些高级功能,帮助用户深入理解并有效使用 sed
。
一、sed
命令基本用法
sed
命令的基本语法如下:
sed [选项] '脚本' [文件...]
- 选项:用于控制
sed
的行为。例如,-n
选项可以关闭默认的输出。 - 脚本:定义了对文本进行的操作。脚本通常包含一个或多个
sed
命令。 - 文件:指定要处理的输入文件。如果没有指定文件,
sed
会从标准输入读取数据。
二、基本操作
打印行(
p
命令)sed
默认会打印每一行。要只打印特定行,可以使用p
命令。例如,要打印文件的第 2 行:sed -n '2p' 文件名
这里
-n
选项告诉sed
只输出符合条件的行,2p
表示打印第 2 行。删除行(
d
命令)使用
d
命令删除特定行。例如,删除文件的第 3 行:sed '3d' 文件名
如果要删除从第 2 行到第 4 行的内容,可以使用:
sed '2,4d' 文件名
替换文本(
s
命令)s
命令用于替换文本。基本语法为:sed 's/模式/替换文本/' 文件名
例如,将文件中的第一个
apple
替换为orange
:sed 's/apple/orange/' 文件名
如果要替换每一行中所有的
apple
,可以添加g
标志:sed 's/apple/orange/g' 文件名
替换多行
通过
-e
选项可以在一个命令中执行多个sed
脚本。例如:sed -e 's/apple/orange/g' -e 's/banana/grape/g' 文件名
这条命令将文件中的
apple
替换为orange
,将banana
替换为grape
。插入和追加文本
插入(
i
命令):在匹配行的前面插入文本。例如,在第 2 行前插入Hello World
:sed '2i\Hello World' 文件名
追加(
a
命令):在匹配行的后面追加文本。例如,在第 2 行后追加Goodbye World
:sed '2a\Goodbye World' 文件名
三、高级用法
正则表达式
sed
支持使用正则表达式进行复杂的模式匹配。常见的正则表达式功能包括:.
:匹配任何单个字符。*
:匹配零个或多个前面的字符。^
:匹配行的开始。$
:匹配行的结束。
例如,将以
start
开头的行替换为begin
:sed 's/^start/begin/' 文件名
使用多个脚本文件
可以将多个
sed
命令写入一个脚本文件,并使用-f
选项执行。例如,创建一个script.sed
文件:s/apple/orange/g s/banana/grape/g
然后用以下命令执行:
sed -f script.sed 文件名
范围操作
sed
允许对特定范围内的行进行操作。例如,将第 2 行到第 4 行之间的apple
替换为orange
:sed '2,4s/apple/orange/g' 文件名
使用分隔符
默认情况下,
sed
使用/
作为分隔符。可以使用其他字符作为分隔符,以便处理包含/
的文本。例如,使用|
作为分隔符:sed 's|/path/to/old|/path/to/new|g' 文件名
扩展正则表达式
使用
-E
选项启用扩展正则表达式,以支持更多的正则表达式功能。例如,匹配apple
或banana
:sed -E 's/(apple|banana)/fruit/g' 文件名
四、脚本示例
删除空行
删除文件中的所有空行:
sed '/^$/d' 文件名
替换特定行中的文本
将第 3 行中的
foo
替换为bar
:sed '3s/foo/bar/' 文件名
打印特定范围的行
打印从第 5 行到第 10 行的内容:
sed -n '5,10p' 文件名
对匹配模式的行进行操作
将所有包含
error
的行替换为FIXED
:sed '/error/s/.*/FIXED/' 文件名
五、总结
sed
是一个功能强大的流编辑器,适用于各种文本处理任务。通过掌握 sed
的基本用法、常见操作和高级功能,用户可以高效地处理和转换文本数据。在实际应用中,sed
的灵活性和强大功能使其成为 Unix 和类 Unix 环境中不可或缺的工具。