用sed替换文本 笔记250419
以下是使用 sed
替换文本的 详细操作指南,涵盖常见场景和实用示例:
一、基础替换语法
sed 's/原内容/替换内容/[选项]' 文件
- 核心参数:
s
:替换命令。/
:分隔符(可替换为其他字符如|
、#
)。原内容
:支持正则表达式。替换内容
:普通文本或引用分组(如\1
)。选项
:g
(全局替换)、i
(忽略大小写)、p
(打印匹配行)等。
二、常见场景示例
1. 简单字符串替换
# 将文件中的 "apple" 替换为 "orange"(默认每行仅替换第一个匹配)
sed 's/apple/orange/' file.txt
# 全局替换所有匹配项(添加 `g` 选项)
sed 's/apple/orange/g' file.txt
2. 替换时忽略大小写
# 将 "Apple"、"APPLE" 等替换为 "orange"(`i` 选项)
sed 's/apple/orange/gi' file.txt
3. 替换特殊字符(如 /
、&
)
# 替换路径中的 "/old/path" 为 "/new/path"(更换分隔符避免转义)
sed 's|/old/path|/new/path|g' file.txt
# 将 "version" 替换为 "Version: &"(`&` 表示匹配的完整内容)
echo "version=1.0" | sed 's/version/Version: &/i'
# 输出:Version: version=1.0
4. 使用分组重组内容 , 分组替换 , 捕获组,反向引用
# 将日期格式从 "YYYY-MM-DD" 改为 "DD/MM/YYYY"
echo "2023-10-05" | sed -r 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/'
# 输出:05/10/2023
sed
命令中的分组(Grouping)是正则表达式的重要功能,通过 ()
将部分模式标记为一个整体,并可通过反向引用在替换操作中重用这些分组内容。
echo "123-456" | sed -r 's/([0-9]+)-([0-9]+)/\2-\1/' # 输出 456-123
()
分组,\1
,\2
引用分组。 从\1
开始, 第一个是\1
- ⚠️
sed
不支持(?:)
语法,所有()
均为捕获分组。
5. 删除内容(替换为空)
# 删除所有数字
sed 's/[0-9]//g' file.txt
# 删除行尾空格
sed 's/[[:space:]]*$//' file.txt
6. 条件替换(限定行范围)
# 仅在第 3 到 5 行替换 "error" 为 "warning"
sed '3,5s/error/warning/g' log.txt
# 在包含 "DEBUG" 的行中替换 "old" 为 "new"
sed '/DEBUG/s/old/new/' file.txt
三、高级技巧
1. 多命令组合
# 同时替换多个内容(分号分隔命令)
sed 's/apple/orange/g; s/banana/grape/g' file.txt
# 或使用 `-e` 参数
sed -e 's/apple/orange/g' -e 's/banana/grape/g' file.txt
2. 直接修改文件
# 直接修改文件内容(原文件会被覆盖,-i 选项)
sed -i 's/apple/orange/g' file.txt
# 修改前备份原文件(生成 file.txt.bak 备份)
sed -i.bak 's/apple/orange/g' file.txt
3. 动态引用 Shell 变量
old="apple"
new="orange"
sed "s/$old/$new/g" file.txt # 使用双引号允许变量展开
4. 处理多行文本
# 将两行合并为一行(例如将 "line1\nline2" 改为 "line1|line2")
sed 'N; s/\n/|/' file.txt
四、调试与安全建议
- 先预览结果:执行命令时先不加
-i
,确认无误后再实际修改文件。sed 's/apple/orange/g' file.txt # 查看输出 sed -i 's/apple/orange/g' file.txt # 确认后执行
- 备份文件:使用
-i.bak
生成备份文件。 - 转义特殊字符:若替换内容包含
/
、&
等符号,建议更换分隔符(如s|old|new|g
)。
五、实战示例
1. 清理配置文件注释
# 删除所有以 `#` 开头的注释行
sed '/^#/d' config.conf
# 删除行内注释(如 "key=value # comment" → "key=value")
sed 's/[[:space:]]*#.*$//' config.conf
2. 批量重命名文件
# 将当前目录下所有 .txt 文件改为 .md
find . -name "*.txt" | sed 's/\(.*\)\.txt/mv "&" "\1.md"/' | sh
3. 格式化 JSON 数据
# 将单行 JSON 转换为多行(简化版)
echo '{"name":"John","age":30}' | sed 's/{/\{\n/g; s/,/,\n/g; s/}/\n}/g'
总结
- 核心命令:
s/pattern/replacement/flags
。 - 安全第一:先测试命令,再使用
-i
修改文件。 - 正则灵活:结合分组、字符类(如
[0-9]
、\w
)等实现精准匹配。
通过组合这些技巧,你可以高效完成几乎任何文本替换任务!
1️⃣ 参考 1
sed
的 替换文本 功能是其最常用的操作,主要通过 s
命令实现。以下是详细用法和示例:
基本语法
sed 's/原内容/替换内容/[标志]' 文件名
- 分隔符:默认使用
/
,但可替换为|
、#
、:
等(避免与内容冲突,例如替换路径时可用|
)。 - 标志(可选):
g
:全局替换(默认只替换每行第一个匹配项)。p
:打印替换后的行(需配合-n
选项使用)。i
或I
:忽略大小写(需配合扩展正则表达式选项如-E
或-r
)。数字
:替换指定第 N 个匹配项(例如s/old/new/2
替换每行第二个匹配项)。
常见场景示例
1. 全局替换
# 替换所有 "apple" 为 "orange"
sed 's/apple/orange/g' file.txt
# 替换每行的第二个 "apple"
sed 's/apple/orange/2' file.txt
2. 直接修改文件
# 使用 -i 选项直接修改文件(谨慎操作!)
sed -i 's/old/new/g' file.txt
# macOS 需指定备份后缀(例如空字符串)
sed -i '' 's/old/new/g' file.txt
3. 替换指定行
# 仅替换第3行的第一个 "old"
sed '3s/old/new/' file.txt
# 替换第5到第10行的所有 "old"
sed '5,10s/old/new/g' file.txt
# 替换以 "start" 开头的行
sed '/^start/s/old/new/g' file.txt
4. 忽略大小写
# 使用 -E(扩展正则)和 i 标志
sed -E 's/foo/bar/gi' file.txt
5. 使用其他分隔符
# 替换路径(避免转义 /)
sed 's|/usr/bin|/usr/local/bin|g' file.txt
6. 删除匹配内容
# 删除所有 "old"
sed 's/old//g' file.txt
# 删除行尾的空白字符
sed 's/\s*$//' file.txt
7. 正则表达式分组
# 捕获分组并引用(例如交换两列内容)
sed -E 's/([a-z]+),([0-9]+)/\2,\1/' data.txt
# 替换日期格式(从 YYYY-MM-DD 到 DD/MM/YYYY)
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/' dates.txt
高级用法
1. 仅打印发生替换的行
sed -n 's/pattern/replacement/p' file.txt
2. 多重条件替换
# 替换第3行的 "foo" 和第5行的 "bar"
sed -e '3s/foo/new/' -e '5s/bar/new/' file.txt
# 或合并为一个命令
sed '3s/foo/new/; 5s/bar/new/' file.txt
3. 替换包含特殊字符的内容
# 替换包含斜杠的内容(需转义)
sed 's/\/path\/to\/old/\/new\/path/g' file.txt
# 或换用其他分隔符
sed 's#/path/to/old#/new/path#g' file.txt
4. 使用变量传递替换内容
# 在脚本中动态替换
old="hello"
new="world"
sed "s/$old/$new/g" file.txt
注意事项
- 测试命令:使用
sed
前先不加-i
选项,确认结果正确后再保存。 - 正则转义:特殊字符(如
*
、$
、^
)需用\
转义。 - 备份文件:使用
-i.bak
生成备份文件(例如sed -i.bak 's/old/new/g' file.txt
)。
2️⃣ 参考 2
使用 sed
命令替换文本的详细指南
sed
(Stream Editor)是 Linux 和类 Unix 系统中强大的流式文本编辑器,擅长对文本进行替换、删除、插入等操作。以下是 sed
替换文本的详细用法和示例:
一、基本替换语法
sed 's/原字符串/新字符串/[选项]' 文件名
s
:表示替换操作(substitute)。原字符串
:支持正则表达式,匹配要替换的内容。新字符串
:替换后的内容。选项
(可选):g
:全局替换(替换所有匹配项,默认只替换每行第一个匹配项)。i
:忽略大小写(如sed 's/hello/hi/i' file.txt
)。- 数字(如
2
):替换每行第 N 个匹配项(如sed 's/apple/orange/2' file.txt
)。
二、常用替换示例
1. 简单替换
- 替换每行第一个匹配项:
sed 's/old/new/' file.txt
- 全局替换(所有匹配项):
sed 's/old/new/g' file.txt
2. 指定行替换
- 替换第3行的内容:
sed '3s/old/new/' file.txt
- 替换第2到第5行的内容:
sed '2,5s/old/new/g' file.txt
3. 使用正则表达式
- 替换以
http
或https
开头的 URL:sed -r 's/(http|https)://\1/g' file.txt
-r
:启用扩展正则表达式。\1
:引用第一个捕获组(http
或https
)。
4. 直接修改文件
- 替换并保存修改(慎用,建议先不加
-i
测试):sed -i 's/old/new/g' file.txt
- 替换并备份原文件:
sed -i.bak 's/old/new/g' file.txt # 生成 file.txt.bak 备份文件
5. 高级替换技巧
- 引用捕获组(替换错误信息并添加时间戳):
sed 's/(Error): (.*)/[$(date)] \1: \2/' log.txt
- 地址范围指定(在第1行前插入注释):
sed '1 i# This is a comment' script.sh
- 删除匹配行(删除包含
error
的行):sed '/error/d' file.txt
三、多命令执行
- 使用分号
;
执行多个命令:sed 's/a/b/; s/c/d/' file.txt
- 使用
-e
执行多个命令:sed -e 's/a/b/' -e 's/c/d/' file.txt
四、从脚本文件读取命令
- 执行脚本文件中的命令:
sed -f script.sed file.txt
script.sed
文件内容示例:s/old1/new1/g s/old2/new2/g
五、替换并打印结果
- 替换并打印替换内容(
-n
和p
选项组合使用):sed -n 's/old/new/gp' file.txt
六、注意事项
特殊字符转义:
- 如果
原字符串
或新字符串
包含/
、&
、\
等特殊字符,需用\
转义。 - 示例:
sed 's/\/old/\/new/g' file.txt
- 如果
跨平台兼容性:
- macOS 的
sed
与 GNUsed
略有不同,建议使用 GNUsed
(通过brew install gnu-sed
安装)。
- macOS 的
备份文件:
- 使用
-i
直接修改文件前,务必备份重要文件。
- 使用
通过灵活组合这些用法,sed
可以高效完成复杂的文本替换任务。建议通过实际案例练习巩固!
3️⃣ 参考 3
以下是使用 sed
命令进行文本替换的详细说明和示例:
1. 基本语法
sed 's/旧字符串/新字符串/标志' 文件名
s
:表示替换(substitute)操作。/
:分隔符(可替换为其他字符,如#
、|
,避免与字符串中的/
冲突)。- 标志:可选,控制替换行为:
g
:全局替换(替换所有匹配项,而非仅第一个)。p
:替换后打印该行(常与-n
结合使用)。i
:忽略大小写。w 文件
:将替换后的行写入指定文件。
2. 常见用法示例
(1) 简单替换(仅替换每行第一个匹配项)
# 将文件中每行的第一个 "apple" 替换为 "banana"
sed 's/apple/banana/' example.txt
输入:
apple banana apple
输出:
banana banana apple
(2) 全局替换(替换所有匹配项)
# 将文件中所有 "apple" 替换为 "banana"
sed 's/apple/banana/g' example.txt
输入:
apple banana apple
输出:
banana banana banana
(3) 直接修改原文件
# 直接修改文件内容(不推荐,除非确认操作正确)
sed -i 's/apple/banana/g' example.txt
(4) 备份原文件后修改
# 修改文件并生成备份(扩展名为 .bak)
sed -i.bak 's/apple/banana/g' example.txt
(5) 替换特定行的内容
# 替换第3行的第一个 "apple"
sed '3s/apple/banana/' example.txt
# 替换第5到第10行的所有 "apple"
sed '5,10s/apple/banana/g' example.txt
(6) 忽略大小写替换
# 忽略大小写,将 "Apple"、"APPLE" 等替换为 "banana"
sed 's/apple/banana/gI' example.txt
(7) 使用正则表达式
# 替换以数字开头的行中的数字(例如 "123abc" → "NUMabc")
sed 's/[0-9]\+/NUM/g' numbers.txt
# 使用扩展正则表达式(需 -E 或 -r 选项)
sed -E 's/(old)(text)/new\1/g' file.txt # 输出 "newoldtext"
(8) 复杂替换(如替换最后一个匹配项)
# 替换每行最后一个出现的 "apple"
sed 's/\(.*\)apple/\1banana/' example.txt
(9) 多命令组合
# 先替换 "apple" 为 "banana",再删除包含 "orange" 的行
sed -e 's/apple/banana/g' -e '/orange/d' fruits.txt
3. 特殊字符处理
如果替换内容包含 /
、&
等特殊字符,需转义或更换分隔符:
# 替换路径中的 "/"(使用 "#" 作为分隔符)
sed 's#old/path/new#new/path/updated#g' config.txt
# 使用 "&" 引用匹配内容(如在末尾添加 "_copy")
sed 's/\(.*\)/\1_copy/' filenames.txt
4. 实际应用示例
示例1:替换配置文件中的端口号
# 将配置文件中的 "port=8080" 替换为 "port=9090"
sed -i 's/port=8080/port=9090/' config.ini
示例2:替换日志文件中的敏感信息
# 将日志中的密码字段替换为 "******"
sed 's/\(password=\)\S*/\1******/' log.txt
示例3:批量替换多个文件
# 将所有 .txt 文件中的 "old" 替换为 "new"
sed -i 's/old/new/g' *.txt
5. 注意事项
- 备份文件:使用
-i
时建议添加备份扩展名(如-i.bak
)。 - 特殊字符转义:正则表达式中的特殊字符(如
.
、*
、$
)需用\
转义。 - 多行处理:
sed
默认逐行处理,需用N
命令将多行合并到模式空间。
6. 总结
sed
是文本替换的利器,通过以下步骤快速上手:
- 基础替换:
sed 's/旧/新/' 文件
。 - 全局替换:添加
g
标志。 - 修改原文件:使用
-i
选项。 - 正则表达式:灵活使用正则匹配复杂模式。
通过组合选项和命令,可以高效完成从简单到复杂的文本替换任务。
4️⃣ 参考 4
以下为你详细介绍如何使用 sed
命令来替换文本,包含不同场景下的示例:
1. 替换每行第一个匹配项
假设你有一个名为 test.txt
的文件,内容如下:
apple is good, apple is delicious.
若要将每行的第一个 apple
替换成 banana
,可使用以下命令:
sed 's/apple/banana/' test.txt
该命令中的 s
是替换命令,apple
为要被替换的旧字符串,banana
是新字符串。执行后输出结果为:
banana is good, apple is delicious.
2. 全局替换每行所有匹配项
若要把 test.txt
文件里每行的所有 apple
都替换成 banana
,可添加 g
修饰符:
sed 's/apple/banana/g' test.txt
执行后输出结果为:
banana is good, banana is delicious.
3. 使用其他分隔符
当替换内容里包含 /
时,为避免频繁转义,可采用其他分隔符,像 #
、|
等。例如,要把 http://example.com
替换成 https://example.com
,可使用如下命令:
sed 's#http://example.com#https://example.com#' test.txt
4. 不区分大小写替换
如果想不区分大小写进行替换,可结合 -i
选项(注意这里的 -i
不是修改文件的 -i
,而是 s
命令的修饰符)。假设文件内容如下:
Apple is good, apple is delicious.
使用以下命令:
sed 's/apple/banana/gi' test.txt
执行后输出结果为:
banana is good, banana is delicious.
5. 替换指定位置的匹配项
若要替换每行的第 n
个匹配项,可在 s
命令后指定数字。例如,替换每行的第二个 apple
为 banana
:
sed 's/apple/banana/2' test.txt
6. 直接修改文件内容
若要直接修改文件内容,可使用 -i
选项。例如,将 test.txt
文件里的所有 apple
替换成 banana
:
sed -i 's/apple/banana/g' test.txt
这里需要注意,使用 -i
会直接修改原文件,所以操作前最好先备份文件。
7. 结合正则表达式进行替换
sed
支持使用正则表达式来匹配更复杂的模式。例如,把所有以 .com
结尾的域名替换成 .org
:
sed 's/[a-zA-Z0-9.-]*\.com/&.org/g' test.txt
其中 &
代表匹配到的字符串。
总结
sed
的替换功能十分强大,借助不同的选项和修饰符,能够灵活应对各种文本替换需求。关键在于理解 s
命令的用法以及修饰符的作用。若你有特定的替换需求,可以提供更详细的信息,我会给出更贴合需求的示例。
5️⃣ 参考 5
sed
是一个强大的流编辑器,可以用来对文本进行各种操作,其中最常见的操作之一就是替换文本。以下是详细的 sed
替换操作示例和解释:
基本语法
sed
替换文本的基本语法是:
sed 's/查找内容/替换内容/选项' 文件名
示例和解释
1. 替换每行的第一个匹配项
sed 's/old/new/' filename
这会将文件 filename
中每一行的第一个 “old” 替换为 “new”。
2. 全局替换
sed 's/old/new/g' filename
这会将文件 filename
中每一行的所有 “old” 替换为 “new”。
3. 替换指定行的文本
sed '2s/old/new/g' filename
这会将文件 filename
中第 2 行的所有 “old” 替换为 “new”。
4. 替换匹配模式的行
sed '/pattern/s/old/new/g' filename
这会将文件 filename
中匹配 /pattern/
的行中的所有 “old” 替换为 “new”。
5. 替换指定范围内的行
sed '1,5s/old/new/g' filename
这会将文件 filename
中第 1 到第 5 行的所有 “old” 替换为 “new”。
6. 替换大小写
sed 's/[Oo][Ll][Dd]/new/g' filename
这会将文件 filename
中所有 “Old”、“old”、“oLd” 等大小写混合的 “old” 替换为 “new”。
常见选项
g
:全局替换,替换每一行中的所有匹配项。p
:打印被替换的行。i
:忽略大小写匹配。n
:只输出被替换的行。
实际应用示例
假设有一个文件 test.txt
,内容如下:
apple banana orange
apple banana orange
apple banana orange
示例 1:替换所有 “apple” 为 “fruit”
sed 's/apple/fruit/g' test.txt
输出:
fruit banana orange
fruit banana orange
fruit banana orange
示例 2:替换第 2 行的 “banana” 为 “fruit”
sed '2s/banana/fruit/g' test.txt
输出:
apple banana orange
apple fruit orange
apple banana orange
示例 3:替换包含 “orange” 的行中的 “apple” 为 “fruit”
sed '/orange/s/apple/fruit/g' test.txt
输出:
fruit banana orange
fruit banana orange
fruit banana orange
示例 4:替换第 1 到第 2 行的 “apple” 为 “fruit”
sed '1,2s/apple/fruit/g' test.txt
输出:
fruit banana orange
fruit banana orange
apple banana orange
示例 5:替换大小写不敏感的 “Apple” 为 “fruit”
sed 's/[Aa][Pp][Pp][Ll][Ee]/fruit/g' test.txt
输出:
fruit banana orange
fruit banana orange
fruit banana orange
通过这些示例,你可以看到 sed
在替换文本方面的强大功能。你可以根据实际需求灵活使用这些命令。
6️⃣ 参考 6
使用 sed
命令替换文本中的内容是一项常见任务。以下是使用 sed
进行文本替换的基本步骤和示例:
基本语法
sed 's/要替换的内容/替换后的内容/' 输入文件
s
表示替换操作。/
是分隔符,可以用其他字符代替,比如#
。要替换的内容
是你要查找的文本。替换后的内容
是你要替换成的新文本。
示例
- 替换文件中的特定文本
假设有一个文件 example.txt
,内容如下:
Hello world
Hello everyone
Goodbye world
要将所有的 “world” 替换为 “Earth”:
sed 's/world/Earth/' example.txt
输出结果:
Hello Earth
Hello everyone
Goodbye Earth
- 全局替换
如果文件中有多处需要替换的内容,可以使用 g
标志进行全局替换:
sed 's/world/Earth/g' example.txt
- 替换文件并保存更改
默认情况下,sed
只会将结果输出到标准输出。如果要直接修改文件,可以使用 -i
选项:
sed -i 's/world/Earth/g' example.txt
注意:使用 -i
选项会直接修改原文件,建议在操作前备份文件。
- 使用不同的分隔符
如果替换内容中包含 /
,可以使用其他字符作为分隔符,比如 #
:
sed 's#要替换的内容#替换后的内容#g' 输入文件
总结
sed
是一个强大的文本处理工具,通过掌握其替换命令的语法和使用方法,可以高效地完成各种文本替换任务。
7️⃣ 参考 7
使用sed
命令进行文本替换的完整指南
一、基本语法与核心功能
sed
(流编辑器)通过正则表达式匹配实现文本替换,其核心命令为s
替换操作,基本格式为:
s e d ′ s / 正则表达式 / 替换内容 / 标 志 ′ 文件名 sed 's/正则表达式/替换内容/标志' 文件名 sed′s/正则表达式/替换内容/标志′文件名
其中:
- 正则表达式:定义需要匹配的文本模式,例如
old_string
- 替换内容:替换后的新文本,如
new_string
- 标志:控制替换行为,如
g
(全局替换)、i
(忽略大小写)
二、关键操作示例
基础全局替换
sed 's/cat/dog/g' input.txt
将所有
cat
替换为dog
(g
标志确保每行多次替换)行首/行尾定位
sed 's/^START://' config.ini # 删除行首的"START:" sed 's/\.$//' text.log # 删除行尾的句号
正则表达式进阶
sed -r 's/([0-9]{3})-([0-9]{4})/\1****/g' data.csv
将电话号码
123-4567
替换为123****
(使用扩展正则表达式-r
和捕获组)变量动态替换(Shell脚本)
key="username" value="admin" sed -i "s/\($key\": \"\).*/\1$value\"/" config.json
修改JSON配置文件中指定键的值
三、关键注意事项
文件直接修改
添加-i
选项直接修改源文件(建议先测试无-i
的命令):sed -i.bak 's/error/warning/g' server.log # 自动创建.bak备份
特殊字符转义
sed 's/\//\\/g' paths.txt # 替换"/"为"\\" sed 's/&/\&/g' html.txt # 处理HTML实体
多条件组合操作
sed -e 's/foo/bar/g' -e '/^#/d' script.sh
同时执行替换和删除注释行
四、典型应用场景
日志文件清洗
sed -E '/ERROR|WARN/d' app.log > clean.log
批量重命名文件
ls *.jpg | sed 's/^2020/ARCHIVE_2020/' | xargs -I{} mv {}
代码版本更新
sed -i '/version:/s/1.2.3/2.0.0/' package.yaml
8️⃣ 参考 8
sed
是 Linux/Unix 系统中用于流式文本替换的核心工具,支持正则表达式和多种编辑操作。以下是其核心用法及常见场景的详解:
一、基础替换语法
基本格式
sed 's/原字符串/新字符串/' 文件名
•
s
表示替换操作,默认仅替换每行的首个匹配项。• 示例:将文件中的首个
apple
替换为orange
:sed 's/apple/orange/' file.txt
全局替换
添加g
标志以替换所有匹配项:sed 's/apple/orange/g' file.txt
若需结合行号限制替换范围(如仅第3行):
sed '3s/apple/orange/g' file.txt
直接修改文件
使用-i
选项直接保存修改(谨慎操作,建议先备份):sed -i 's/apple/orange/g' file.txt
二、高级替换技巧
处理特殊字符
若替换内容包含/
,可改用其他分隔符(如#
或|
):sed 's#/old/path#/new/path#' file.txt
正则表达式应用
• 替换所有数字为#
:sed 's/[0-9]/#/g' file.txt
• 匿名化 IP 地址(隐藏最后一段):
sed -E 's/([0-9]+\.[0-9]+\.[0-9]+)\.([0-9]+)/\1.xxx/g' log.txt
捕获组与反向引用
使用\(...\)
捕获组并通过\1
引用:sed 's/\(love\)able/\1rs/g' file.txt # loveable → lovers
多命令执行
用-e
或分号分隔多个命令:sed -e '1,5d' -e 's/error/warning/g' log.txt # 先删1-5行,再替换error
三、常见场景示例
删除注释与空行
sed -i '/^#/d; /^$/d' script.sh # 删除以`#`开头的行和空行
批量替换多个文件
sed -i 's/http:\/\/old.com/https:\/\/new.com/g' *.html # 替换所有HTML文件中的域名
指定行范围替换
sed '5,10s/error/warning/g' log.txt # 仅替换5-10行的error
插入/追加文本
• 在第2行前插入文本:sed '2i\插入内容' file.txt
• 在匹配行后追加:
sed '/pattern/a\追加内容' file.txt
四、注意事项
备份文件
使用-i.bak
生成备份文件(如file.txt.bak
):sed -i.bak 's/apple/orange/g' file.txt
转义特殊字符
如替换内容包含&
或\
,需用\
转义:sed 's/path/\/usr\/local\//g' file.txt # 替换为含`/`的路径
大小写不敏感
添加I
标志以忽略大小写:sed 's/apple/orange/Ig' file.txt # 匹配Apple、APPLE等
通过灵活组合这些命令,sed
可高效完成日志处理、配置修改等复杂任务。更多高级用法(如多行文本处理、标签跳转)可参考 。
9️⃣ 参考 9
使用 sed
进行文本替换是其最常见的应用之一。以下是关于如何使用 sed
命令进行文本替换的详细说明和示例:
基本替换语法
sed 's/模式/替换内容/' 文件
s
:表示替换操作(substitute)。/模式/
:指定要匹配的模式(可以使用正则表达式)。/替换内容/
:指定用于替换的新内容。- 默认情况下,
sed
只替换每行中第一次出现的目标模式。
示例
将每行中的第一个 “apple” 替换为 “banana”
sed 's/apple/banana/' 文件.txt
说明:只替换每行中第一次出现的 “apple”。
将每行中所有的 “apple” 替换为 “banana”
sed 's/apple/banana/g' 文件.txt
说明:
g
标志表示全局替换,即替换每行中所有出现的 “apple”。替换时区分大小写
默认情况下,
sed
是区分大小写的。如果需要忽略大小写,可以使用I
标志(在 GNUsed
中支持)。sed 's/apple/banana/Ig' 文件.txt
仅替换特定行
可以指定要替换的行范围或特定行。例如,仅替换第2行中的 “apple”:
sed '2s/apple/banana/' 文件.txt
或者,替换第2到第4行中的 “apple”:
sed '2,4s/apple/banana/g' 文件.txt
在匹配模式前后添加内容
例如,在每个 “apple” 前后添加括号:
sed 's/apple/(&)/g' 文件.txt
说明:
&
代表匹配到的整个模式。使用不同的分隔符
当模式或替换内容中包含
/
时,可以使用其他分隔符(如|
)以避免转义。sed 's|/home/user|/var/www|g' 文件.txt
高级替换示例
删除行尾的空格
sed 's/[ \t]*$//' 文件.txt
说明:匹配行尾的所有空格和制表符,并将其替换为空。
替换包含特殊字符的模式
例如,将 “price=100” 替换为 “price=200”:
sed 's/price=100/price=200/' 文件.txt
使用变量进行替换
可以结合 Shell 变量进行动态替换:
var="banana" sed "s/apple/$var/g" 文件.txt
在替换时保留部分匹配内容
例如,将 “color:red” 替换为 “color=#FF0000”:
sed 's/color=red/color=#FF0000/' 文件.txt
直接修改文件
使用 -i
选项可以直接在文件中进行替换,而无需输出到新文件:
sed -i 's/old/new/g' 文件.txt
注意:直接修改文件前,建议先备份:
sed -i.bak 's/old/new/g' 文件.txt
这将在修改文件前创建一个名为 文件.txt.bak
的备份。
总结
sed
提供了灵活且强大的文本替换功能,适用于各种复杂的文本处理需求。通过掌握其基本语法和高级用法,可以高效地进行批量文本编辑。建议在实际使用中结合具体需求进行练习,以加深理解。
🔟 参考 10
sed
是 Linux/Unix 系统中强大的流式文本编辑工具,支持通过命令行快速实现文本替换、删除、插入等操作。以下是关于 sed
替换文本的核心指南:
一、基本替换语法
sed 's/旧内容/新内容/' 文件名
s
表示替换(substitute)//
之间的内容为定界符,可自定义(如s:old:new:
)- 示例:将文件中所有
foo
替换为bar
:sed 's/foo/bar/g' file.txt
g
表示全局替换(每行所有匹配项)
二、关键参数与扩展用法
直接修改文件
sed -i 's/old/new/g' file.txt # 原地修改文件
-i
会直接修改原文件,建议提前备份!
仅替换特定行
sed '3s/foo/bar/' file.txt # 仅替换第3行的 foo
- 可指定行号或行范围(如
2,5s/.../
)
- 可指定行号或行范围(如
支持正则表达式
- 模糊匹配:
sed 's/fo+/fum/g'
将fo
,foo
,foooo
等替换为fum
- 行首/行尾:
^start
匹配行首,end$
匹配行尾
- 模糊匹配:
多条件替换
sed -e 's/foo/bar/g' -e 's/test/demo/g' file.txt
- 用
-e
或分号;
分隔多条命令
- 用
三、高级技巧
分组与引用
捕获括号内的内容并用\1
,\2
引用:sed 's/\([a-z]\)_\1/\U&/g' file.txt # 将 "a_a" 转为大写 "A_A"
忽略大小写替换
sed 's/hello/HELLO/gI' file.txt # I 表示忽略大小写
处理特殊字符
- 如果内容包含
/
,改用其他定界符(如#
):sed 's#/path/to/file#/mnt/data#g' file.txt
- 如果内容包含
结合其他命令
- 配合
grep
筛选后替换:grep "ERROR" log.txt | sed 's/ERROR/WARNING/g'
- 配合
四、实际应用案例
批量替换目录下所有文件
find . -type f -name "*.log" | xargs sed -i 's/old/new/g'
替换并保留原始文件
cp file.txt file.bak && sed -i 's/old/new/g' file.txt
删除空行
sed '/^$/d' file.txt # 删除所有空行
五、注意事项
- 备份重要文件:使用
-i
前务必备份原文件。 - 测试先行:先用
sed 'command' file.txt
查看效果,再执行修改。 - 区分
sed
与awk
:复杂逻辑处理推荐awk
,简单替换首选sed
。
掌握以上技巧后,你可以通过组合命令解决大多数文本替换需求。更多细节可通过 man sed
或在线文档深入学习。
一、基础替换语法
1. 单次替换
sed 's/old/new/' file.txt
- 说明:仅替换每行中第一个匹配项。
- 示例:将
apple
替换为orange
(仅首词替换):sed 's/apple/orange/' fruits.txt
2. 全局替换
sed 's/old/new/g' file.txt
- 说明:替换每行中所有匹配项(
g
表示全局)。 - 示例:将所有
apple
替换为orange
:sed 's/apple/orange/g' fruits.txt
二、关键功能与技巧
1. 直接修改文件
sed -i 's/old/new/g' file.txt
- 说明:
-i
选项直接修改原文件(慎用,建议备份:-i.bak
)。 - 示例:备份原文件并替换:
sed -i.bak 's/apple/orange/g' fruits.txt
2. 指定行范围替换
- 单行:
3s/old/new/g
(仅第3行)。 - 行区间:
5,10s/old/new/g
(第5-10行)。 - 模式匹配行:
/pattern/s/old/new/g
(匹配含pattern
的行)。
3. 处理特殊字符
- 分隔符替换:若替换内容含
/
,改用#
或@
:sed 's#/usr/bin#opt/bin#g' path.txt
- 转义字符:用
\
转义特殊符号(如.
、*
):sed 's/\./,/g' file.txt # 替换所有 `.` 为 `,`
三、高级替换场景
1. 捕获组与反向引用
sed 's/\(old\)/\1_\2/g' file.txt
- 说明:用
()
捕获组,\1
引用内容。 - 示例:在
old
后添加下划线:sed 's/\(old\)/\1_/g' text.txt
2. 忽略大小写替换
sed 's/apple/orange/I' file.txt
- 说明:
I
标志忽略大小写(如替换Apple
、APPLE
)。
3. 多条件替换
- 同时替换多个模式:
sed -e 's/apple/orange/g' -e 's/banana/grape/g' file.txt
- 使用正则表达式:
sed -E 's/(apple|banana)/fruit/g' file.txt # 替换 apple/banana 为 fruit
四、实战案例
1. 批量修改配置文件
sed -i 's/127.0.0.1/0.0.0.0/g' /etc/hosts
- 场景:将本地回环地址改为通配符地址。
2. 匿名化日志中的 IP
sed -E 's/([0-9]{1,3}\.){3}[0-9]{1,3}/XXX.XXX.XXX.XXX/g' access.log
- 场景:隐藏日志中的真实 IP。
3. 调整日期格式
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/g' dates.txt
- 场景:将
YYYY-MM-DD
转为DD/MM/YYYY
。
五、注意事项
- 备份原文件:使用
-i.bak
避免误操作。 - 性能优化:处理大文件时,可结合
--unbuffered
减少内存占用。 - 正则表达式:默认使用基础正则,复杂模式需加
-E
或-r
。
通过灵活组合地址范围、正则表达式和替换标志,sed
可高效完成从简单替换到复杂文本重构的任务。