需要批量修改100个配置文件?sed让你一行命令搞定,告别枯燥的重复劳动。
sed(Stream Editor,流编辑器)是Linux系统中强大的非交互式文本编辑器。与vim、nano等交互式编辑器不同,sed可以自动批量处理文本,无需人工干预。
想象一下:你需要在100个配置文件中修改某个参数。用传统编辑器要打开-修改-保存100次,而sed只需要一行命令。
sed填补了grep和awk之间的空白:
| grep | ||
| sed | ||
| awk |
sed的定位:比grep强大(能修改),比awk简单(易上手)。
理解sed的关键是理解模式空间(Pattern Space):
输入文件 → [读取一行] → 模式空间 → [执行命令] → 输出 → [清空] → 下一行这个流程让sed能高效处理大文件,内存占用极低。
# 将文件中所有的"apple"替换为"orange"sed 's/apple/orange/' fruits.txts = substitute(替换)/ = 分隔符(可用其他字符替代)注意:默认只替换每行第一个匹配项。
# 替换每行所有匹配项sed 's/apple/orange/g' fruits.txt-g = global(全局),这是使用频率最高的参数。
# -i 参数直接修改文件(in-place)sed -i 's/old/new/g' config.txt# 修改前备份原文件sed -i.bak 's/old/new/g' config.txt⚠️ 重要:-i 会直接修改原文件,建议先用不带-i的命令测试,确认无误后再添加-i。
# 删除第3行sed '3d' file.txt# 删除包含"test"的行sed '/test/d' file.txt# 删除空行sed '/^$/d' file.txt# 删除1-5行sed '1,5d' file.txtd = delete(删除)
# 只打印第5行sed -n '5p' file.txt# 打印5-10行sed -n '5,10p' file.txt# 打印包含"error"的行sed -n '/error/p' file.txt-n = 静默模式(不自动打印),p = print(打印)
当替换内容包含/时,可以更换分隔符:
# 替换文件路径(使用#作为分隔符)sed 's#/usr/local/bin#/opt/bin#g' config.txt# 替换URL(使用|作为分隔符)sed 's|https://old.com|https://new.com|g' urls.txt可用分隔符:/#|:@ 等
# 删除行首的数字sed 's/^[0-9]* //' data.txt# 删除行尾的空格sed 's/ *$//' file.txt# 提取邮箱用户名(@前面的部分)sed 's/@.*//' emails.txt# 格式化电话号码(12345678901 → 123-4567-8901)echo "13800138000" | sed 's/\(...\)\(....\)\(....\)/\1-\2-\3/'# 一行执行多个命令(用;分隔)sed 's/foo/bar/g; s/baz/qux/g' file.txt# 使用-e参数sed -e 's/foo/bar/g' -e 's/baz/qux/g' file.txt# 使用脚本文件sed -f script.sed file.txt# 只在第5行替换sed '5s/old/new/' file.txt# 在包含"START"和"END"之间的行替换sed '/START/,/END/s/old/new/' file.txt# 只在以#开头的行操作(注释行)sed '/^#/s/old/new/' config.txt# 保留部分匹配(使用\1 \2等)# 将"John Smith"改为"Smith, John"echo "John Smith" | sed 's/\([a-zA-Z]*\) \([a-zA-Z]*\)/\2, \1/'# 在行首添加注释sed 's/^/# /' file.txt# 删除行首的注释sed 's/^# //' file.txt# 将制表符替换为4个空格sed 's/\t/ /g' file.txt# 批量修改数据库配置sed -i 's/localhost/db.example.com/g' *.confsed -i 's/3306/3307/g' *.conf# 修改日志级别sed -i 's/LOG_LEVEL=INFO/LOG_LEVEL=WARN/g' config.properties# 提取时间戳和日志级别sed 's/.*\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}.*\[INFO\|ERROR\|WARN\]\).*/\1/' app.log# 删除ANSI颜色代码sed 's/\x1b\[[0-9;]*m//g' colored.log# 删除CSV文件中的引号sed 's/"//g' data.csv# 统一分隔符(将逗号改为制表符)sed 's/,/\t/g' data.csv# 删除Windows换行符(^M)sed 's/\r$//' windows.txt# 批量替换函数名sed -i 's/oldFunctionName/newFunctionName/g' *.js# 修改导入路径sed -i 's|from "@/components|from "@/shared/components|g' *.vue# 添加文件头注释sed -i '1s/^/\/\* Copyright 2026 Company Name \*\/\n/' *.js# 先找到包含"deprecated"的行,然后替换grep -l "deprecated" *.py | xargs sed -i 's/deprecated/new_method/g'# 提取日志中的时间,然后格式化grep "ERROR" app.log | sed 's/.*\([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\).*/\1/'# 提取、过滤、格式化一条龙cat data.log | \ grep "transaction" | \ sed 's/.*amount=\([0-9]*\).*/\1/' | \ awk '{sum+=$1} END {print "Total:", sum}'Q: sed修改后文件内容没有变化?
A: 检查是否使用了-i参数。sed默认输出到标准输出,不会修改原文件。
Q: 如何在Mac和Linux上都正常使用?
A: Mac的sed和GNU sed有差异。建议:
# Mac用户安装GNU sedbrew install gnu-sed# 使用gsed命令Q: 如何替换包含换行符的内容?
A: sed默认按行处理,跨行替换较复杂。简单方案:
# 先将换行符替换为特殊标记tr '\n' '|' < file.txt | sed 's/old/new/g' | tr '|' '\n'Q: sed和perl替换有什么区别?
A: perl更强大,支持更复杂的正则:
# perl支持非贪婪匹配perl -pe 's/<.*?>/ /g' file.htmlsed作为Linux三驾马车之二,是文本自动化的利器:
记住:凡是需要重复3次以上的文本编辑操作,都值得用sed自动化。
上一篇:《Linux三驾马车之一:grep命令,3分钟成为日志搜索高手》
下一篇预告:《Linux三驾马车之三:awk命令,数据处理的瑞士军刀》
本文是Linux三驾马车系列第二篇,敬请期待后续内容。
《史记》原著全书共130篇,五十二万六千五百余字。
部头太大,时间有限,怎么办?
人物繁杂,筛选起来困难,怎么办?
原著文古质,艰涩难懂,怎么办?
一套《彩色图解史记》这些问题全搞定!彩色图解、简单明了、通俗易懂、老少皆宜。

