Linux怎么批量替换文件内容_Linux如何用sed全局替换字符串【技巧】

千静酱_7862

千静酱_7862

2026-03-22

291人浏览

原创

sed默认不修改原文件,需加-i选项;macos需sed -i '',linux直接sed -i;推荐用#作分隔符避免转义;整行替换用c\命令更精准;批量处理用find -exec sed {} +更安全。

linux怎么批量替换文件内容_linux如何用sed全局替换字符串【技巧】

sed 替换不生效?默认只处理标准输入,没加 -i 就不会改原文件

很多人跑完 sed 's/old/new/g' 发现文件一点没变——因为 sed 默认是“只读模式”,输出到终端,不碰原文件。必须加 -i 才能就地修改。但注意:-i 在 macOS 和 Linux 行为不同:Linux 下直接写 sed -i 's/old/new/g' file.txt 即可;macOS(BSD sed)要求带空字符串参数:sed -i '' 's/old/new/g' file.txt,否则报错 command a expects \ followed by text。

  • -i 后不跟后缀 → 直接覆盖原文件(无备份),高危操作,建议先试 -i.bak
  • 批量处理多个文件时,sed -i 's/.../.../g' *.txt 是安全的,shell 会自动展开通配符
  • 如果路径含空格或特殊字符,用 find ... -exec sed -i ... {} + 更稳,避免 shell 分词问题

替换含斜杠 / 的路径或 URL?用其他分隔符避开转义地狱

写 sed 's/usr/local/bin/\/opt\/bin/g' 不仅难读,还容易漏掉某个 \/ 导致语法错误。其实 sed 支持任意分隔符,只要和 s 命令后的第一个字符一致就行。换成 # 或 |,路径直接写,不用转义:

sed -i 's#/usr/local/bin#/opt/bin#g' config.conf

这个技巧在处理 Docker 镜像名、HTTP URL、JSON 路径时特别省心。但注意:分隔符本身如果出现在替换内容里,还得转义,比如想把 foo|bar 换成 baz|qux,用 | 当分隔符就得写成 s#foo\|bar#baz\|qux#g。

  • 常用替代分隔符:#(最推荐)、|、@、_
  • 别用 /、&、\ 这些在正则里有特殊含义的字符当分隔符,除非你清楚后果
  • 如果内容来自变量(如 $PATH),优先考虑 perl -i -pe 或 awk,避免 shell 展开和 sed 解析双重逃逸

想替换整行匹配的内容?别只盯着 s///,sed '/pattern/c\new line' 更精准

有时候要整个删掉某行再替换成固定内容,比如把所有 debug = false 行换成 debug = true。用 s/debug = false/debug = true/ 会误伤 log_debug = false 这类子串。这时用地址匹配 + 行替换命令更可靠:

sed -i '/^debug = false$/c\debug = true' settings.ini

c\ 表示“change this line”,后面紧跟新内容,^ 和 $ 锁定整行,避免部分匹配。它比 s/// 少一层正则捕获开销,也更直观。

  • /pattern/d 删除整行,/pattern/a\text 在匹配行后追加,/pattern/i\text 在前面插入
  • 多个条件组合?用 -e 串联:sed -i -e '/^host:/c\host = localhost' -e '/^port:/c\port = 8080' conf.yml
  • 注意:Windows 换行符(\r\n)会导致 ^$ 失效,先用 dos2unix 或 tr -d '\r' 清理

批量替换跨多级目录?find + sed 组合要注意 -exec 的结尾符号

想改 src/ 下所有 .py 文件里的 print 为 logging.info,写成 find src -name "*.py" | xargs sed -i 's/print/logging.info/g' 看似合理,但文件名含空格时会崩。正确姿势是用 -exec 并以 + 结尾:

find src -name "*.py" -exec sed -i 's/print/logging.info/g' {} +

{} + 让 find 把一批文件名一次性传给 sed,效率高且安全;用 {} \; 则每个文件单独调用一次 sed,慢且容易触发系统参数限制。

  • 如果要排除某些目录(如 venv),加 -not -path "*/venv/*"
  • 替换前建议先用 find ... -exec grep -l "pattern" {} + 确认目标范围,避免误操作
  • 某些老旧系统(如 CentOS 6)的 find 不支持 +,只能退化为 \;,此时务必加 2>/dev/null 忽略权限错误提示

真正麻烦的是嵌套引号、变量插值、多层转义——这些地方 sed 很快就力不从心。一旦需求变复杂(比如“只替换函数体内的字符串”),该切到 perl 或写个 Python 脚本了,别硬撑。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2015

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

2922

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

996

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3299

7

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.27

2560

5

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

2026.02.03

249

24

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

529

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1678

6

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1618

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习