在Linux系统中,替换文本是日常运维和开发中的常见操作,熟练掌握替换命令能极大提升工作效率,Linux提供了多种文本替换工具,包括sed
、awk
、vim
等,其中sed
(Stream Editor)是最常用且功能强大的命令行工具,本文将重点介绍sed
命令的使用方法,并辅以其他工具的简要说明。

sed命令基础
sed
是一种流编辑器,它一次处理一行内容,将处理后的结果输出到标准输出(通常是终端)。sed
的基本语法为sed [选项] '命令' 文件
,常用选项包括-n
(取消默认输出)、-i
(直接修改文件内容)、-e
(执行多个命令)等,替换命令是sed
的核心功能,通过s/原字符串/新字符串/
的格式实现,其中斜杠是分隔符,也可以使用其他字符(如、)当原字符串或新字符串中包含斜杠时。
sed替换命令详解
-
基本替换
最简单的替换命令为s/pattern/replacement/
,例如将文件test.txt
中的hello
替换为world
,可执行sed 's/hello/world/g' test.txt
,其中g
标志表示全局替换(默认只替换每行第一次出现的匹配项),若不加g
,则仅替换每行第一个hello
。 -
标志位的使用
s
命令支持多个标志位,常用标志包括:g
:全局替换,替换一行中所有匹配项。n
:替换第n次出现的匹配项,如s/hello/world/2
表示替换每行第二个hello
。i
:忽略大小写替换,如s/hello/world/gi
,忽略大小写并全局替换。p
:打印替换后的行,需与-n
选项配合使用,例如sed -n 's/hello/world/p' test.txt
仅输出被替换的行。
-
地址范围的应用
可通过地址限制替换范围,地址可以是行号(如1,5
表示1到5行)、正则表达式(如/^#/
表示以开头的行)或二者的组合。(图片来源网络,侵删)sed '2,5s/hello/world/g' test.txt
:仅替换2到5行的hello
。sed '/error/s/hello/world/g' test.txt
:仅包含error
的行进行替换。sed '3,$s/hello/world/g' test.txt
:从第3行到文件末尾进行替换(表示最后一行)。
-
直接修改文件
默认情况下,sed
将结果输出到终端,若需直接修改文件,使用-i
选项,例如sed -i 's/hello/world/g' test.txt
会直接替换文件内容,为避免误操作,建议先备份文件,如sed -i.bak 's/hello/world/g' test.txt
,在原文件旁创建.bak
备份文件。 -
多命令执行
若需对同一文件执行多个替换命令,可通过-e
选项或分号分隔。sed -e 's/hello/world/g' -e 's/hi/hey/g' test.txt
sed 's/hello/world/g; s/hi/hey/g' test.txt
-
特殊字符处理
当替换内容包含斜杠、&
等特殊字符时,需进行转义或使用其他分隔符。sed 's/\/usr\/local\/bin/\/usr\/bin/g' test.txt
(转义斜杠)sed 's#/usr/local/bin#/usr/bin#g' test.txt
(使用作为分隔符)&
代表匹配的完整模式,如s/hello/& world/g
会将hello
替换为hello world
。
其他替换工具简介
-
vim编辑器
在vim中,可通过s
命令进行替换,(图片来源网络,侵删)%s/hello/world/g
:全局替换(当前文件)。1,5s/hello/world/g
:替换1到5行。%s/hello/world/gc
:全局替换并确认(需手动确认每次替换)。
-
awk命令
awk
更适合复杂文本处理,替换语法为gsub(pattern, replacement)
,例如awk '{gsub(/hello/, "world"); print}' test.txt
全局替换并打印每行。 -
tr命令
tr
用于字符替换(不支持正则),例如tr 'a-z' 'A-Z' < test.txt
将小写字母转为大写。
常见场景示例
以下为sed
替换的常见应用场景及命令总结:
场景描述 | sed命令 |
---|---|
替换文件中所有old 为new |
sed -i 's/old/new/g' file.txt |
仅替换包含error 的行中的fail 为success |
sed -i '/error/s/fail/success/g' file.txt |
删除每行开头的空格(替换空格为空) | sed -i 's/^ *//' file.txt |
删除文件所有空行 | sed -i '/^$/d' file.txt |
在匹配行后添加文本(a 命令) |
sed -i '/hello/a\ new line' file.txt |
在匹配行前插入文本(i 命令) |
sed -i '/hello/i\ pre line' file.txt |
相关问答FAQs
Q1: sed替换时如何保留原文件备份?
A1: 使用-i
选项时结合文件扩展名可实现备份,例如sed -i.bak 's/hello/world/g' test.txt
,执行后会生成test.txt.bak
备份文件,原文件被修改,若需手动备份,可先执行cp test.txt test.txt.bak
再进行替换。
Q2: 如何替换包含特殊字符(如、)的字符串?
A2: 对于包含斜杠的字符串,可使用其他分隔符(如、)代替,例如sed 's#/usr/local/bin#/usr/bin#g' file.txt
,对于等正则特殊字符,需用反斜杠转义,如sed 's/\$/€/g' file.txt
(将替换为欧元符号)。