在Linux系统中,sed(stream editor)命令是一个非常强大的文本处理工具。它主要用于对文本文件进行过滤和转换操作,支持非交互式的文本编辑。今天,我们就来深入了解一下sed命令的详细使用方法,并结合一些实际示例来加深理解。
sed [选项] [脚本] [输入文件...]
其中每个[选项]所代表的意思如下:
-e script: 允许直接在命令行中提供编辑脚本。
-f script-file: 从指定的文件中读取编辑脚本。
-n: 仅打印经过sed处理的行,而不打印原始文件中的未修改行。
-i: 直接修改文件内容,而不是输出到标准输出(屏幕)。通常与模式字符串一起使用,以执行原地编辑。
-i.bak: 与-i类似,但会创建原始文件的备份,备份文件的名称通常在原始文件名后加上.bak。
-r: 使sed使用扩展的正则表达式,默认情况下使用基本的正则表达式。
-E: 与-r类似,但是是GNU sed的选项,用于使用扩展的正则表达式。
-u: 使sed使用默认的未缩写形式的正则表达式。
-v: 增加输出的详细程度,例如在处理时显示脚本信息。
--quiet 或 -silent: 等同于-n选项,仅打印处理后的行。
--verbose: 等同于-v选项,提供详细的处理信息。
--version: 显示sed的版本信息。
-h 或 --help: 显示帮助信息。
[脚本]:具体的编辑命令,如s/old/new/g(将所有old替换为new)
[输入文件]:需要处理的文本文件。
sed脚本由一系列的命令组成,每个命令都由一个或多个字母缩写表示。这些命令可以操作文本,执行搜索、替换、删除、插入等操作。以下是一些常用的sed命令及其含义:
a\text:在当前行后追加\text指定的文本,并开始新的一行。
i\text:在当前行前插入\text指定的文本,并继续处理下一行。
c\text:用\text指定的文本替换当前行,并开始新的一行。
d:删除当前行,并开始新的一行。
D:删除从当前行开始到第一个非空行的所有行。
p:打印当前行的内容。
s/regexp/replacement/:使用正则表达式regexp查找并替换为replacement。这个命令有多个变体,如:
g:全局替换,替换行中所有匹配的regexp。
n:仅替换第n次出现的匹配。
1:仅对第一行执行替换。
w file:将替换的结果写入到指定的文件file中。
r file:读取file文件的内容,并插入到模式空间中。
w file:将当前模式空间的内容写入到指定的文件file中。
l:列出模式空间的内容,每个字符占一行。
N:追加下一行到模式空间中,以便进行多行操作。
P:打印模式空间中的第一行。
h:将模式空间的内容复制到保持空间(hold space)
g:从保持空间复制内容到模式空间。
G:将保持空间的内容追加到模式空间的末尾。
t label:如果上一次替换成功,则跳转到标签label处继续执行命令。
T label:如果上一次替换失败,则跳转到标签label处继续执行命令。
b label:无条件跳转到标签label处继续执行命令。
a\text - 添加新行:
sed '5a New line' file.txt #在文件file.txt的第5行之后添加文本"New line"
在文件file.txt的第5行之后添加文本"New line"
i\text - 插入文本:
sed '5i Inserted text' file.txt #在文件file.txt的第5行之前插入文本"Inserted text"
在文件file.txt的第5行之前插入文本"Inserted text"
c\text - 更换文本:
sed '5c Replaced line' file.txt #将文件file.txt的第5行替换为"Replaced line"。
将文件file.txt的第5行替换为"Replaced line"。
d - 删除行:
sed '5d' file.txt #删除文件file.txt的第5行。
删除文件file.txt的第5行。
p - 打印行:
sed -n '5p' file.txt #打印文件file.txt的第5行。
打印文件file.txt的第5行。
s/old/new/g - 替换文本
sed 's/old/new/g' file.txt
将文件file.txt中所有的"old"替换为"new"。
r file - 读取文件内容:
sed '5r anotherfile.txt' file.txt #在文件file.txt的第5行之后插入anotherfile.txt的内容。
在文件file.txt的第5行之后插入anotherfile.txt的内容。
w file - 将模式空间内容写入文件
sed -n '5,10w output.txt' file.txt #将文件file.txt的第5行到第10行的内容写入output.txt。
将文件file.txt的第5行到第10行的内容写入output.txt。
l - 列出模式空间的内容:
sed '5l' file.txt #打印文件file.txt第5行的内容,每个字符占一行。
打印文件file.txt第5行的内容,每个字符占一行。
N - 追加下一行到模式空间:
sed ':a;N;$!ba;s/\n//' file.txt #删除文件file.txt中除了最后一行以外的所有换行符。
删除文件file.txt中除了最后一行以外的所有换行符。
P - 打印模式空间的第一行:
sed '5P' file.txt #打印文件file.txt第5行之前的内容。
打印文件file.txt第5行之前的内容。
h - 将模式空间的内容复制到保持空间:
sed '5h;10g' file.txt
在文件file.txt的第5行时,将模式空间的内容复制到保持空间,并在第10行时将保持空间的内容与模式空间合并。
g - 从保持空间复制内容到模式空间:
sed '5g;10G' file.txt
在文件file.txt的第5行时,将保持空间的内容复制到模式空间,并在第10行时将模式空间的内容追加到保持空间的末尾。
G - 将模式空间的内容追加到保持空间:
sed '5G;10h' file.txt
在文件file.txt的第5行时,将模式空间的内容追加到保持空间,并在第10行时将保持空间的内容复制到模式空间。
t label - 条件跳转:
sed ':a;s/old/new/;t loop;ba' file.txt
将文件file.txt中的"old"替换为"new",如果替换成功则跳转到标签loop,否则继续执行。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!