在 Linux 系统中,sedStream Editor)是一个非常强大且灵活的文本处理工具。它不仅可以用于简单的文本替换、删除和插入操作,还能实现复杂的文本转换任务。


📌 一、什么是 sed?

sed 是一个基于模式匹配对文本进行过滤或修改的流编辑器。它可以:

  • 替换文本内容
  • 删除指定行
  • 插入或追加新内容
  • 打印特定行
  • 使用正则表达式进行高级匹配
  • 多条命令组合处理

与交互式编辑器(如 vim)不同,sed 是非交互式的,适合在脚本中自动执行批量文本处理任务。


🔧 二、sed 基本语法

sed [选项] '命令' 文件名

示例:

sed 's/old/new/' file.txt

表示将 file.txt 中每一行的第一个 old 替换为 new


🧱 三、常用命令格式说明

命令 含义
s/pattern/replacement/flags 替换命令(最常用)
d 删除匹配的行
p 打印匹配的行(常与 -n 搭配使用)
i\text 在匹配行前插入文本
a\text 在匹配行后追加文本
c\text 替换整行内容
y/abc/xyz/ 字符替换(一一对应)

📚 四、实战示例

✅ 示例 1:替换第一个匹配项(s 命令)

📄 原始内容(input.txt):
hello world
hello there
🔧 使用命令:
sed 's/hello/hi/' input.txt
✅ 输出结果:
hi world
hi there

只替换每行中第一个出现的 hello


✅ 示例 2:替换所有匹配项(加 g 标志)

📄 原始内容(input.txt):
hello world hello
hello again
🔧 使用命令:
sed 's/hello/hi/g' input.txt
✅ 输出结果:
hi world hi
hi again

g 表示全局替换,替换该行中所有匹配项。


✅ 示例 3:删除某一行(d 命令)

📄 原始内容(input.txt):
apple
banana
orange
🔧 使用命令:
sed '2d' input.txt
✅ 输出结果:
apple
orange

删除第 2 行(banana)。


✅ 示例 4:删除包含某个关键词的行(/pattern/d

📄 原始内容(input.txt):
error: failed to connect
success: connection ok
error: timeout
🔧 使用命令:
sed '/error/d' input.txt
✅ 输出结果:
success: connection ok

删除所有包含 error 的行。


✅ 示例 5:打印特定行(-n + p

📄 原始内容(input.txt):
line one
line two
line three
🔧 使用命令:
sed -n '2p' input.txt
✅ 输出结果:
line two

只打印第 2 行。-n 阻止默认输出,p 显式打印指定行。


✅ 示例 6:在匹配行前插入内容(i\

📄 原始内容(input.txt):
header line
data line
footer line
🔧 使用命令:
sed '/data/i\--- INSERTED LINE ---' input.txt
✅ 输出结果:
header line
--- INSERTED LINE ---
data line
footer line

在包含 data 的行前面插入新内容。


✅ 示例 7:在匹配行后追加内容(a\

📄 原始内容(input.txt):
start section
some data
end section
🔧 使用命令:
sed '/end/a\--- APPENDED LINE ---' input.txt
✅ 输出结果:
start section
some data
end section
--- APPENDED LINE ---

在包含 end 的行后面追加新内容。


✅ 示例 8:替换整行内容(c\

📄 原始内容(input.txt):
old config value
new config value
🔧 使用命令:
sed '/old/c\updated config value' input.txt
✅ 输出结果:
updated config value
new config value

替换整行内容。


✅ 示例 9:字符替换(y/abc/xyz/

📄 原始内容(input.txt):
abc def ghi
🔧 使用命令:
sed 'y/abc/xyz/' input.txt
✅ 输出结果:
zyx def ghi

a->z, b->y, c->x 一一替换。


✅ 示例 10:删除空行(/^$/d

📄 原始内容(input.txt):
This is a line.

Another line.
🔧 使用命令:
sed '/^$/d' input.txt
✅ 输出结果:
This is a line.
Another line.

删除空白行。


✅ 示例 11:删除注释行(以 # 开头)

📄 原始内容(input.txt):
# comment line
valid line
# another comment
🔧 使用命令:
sed '/^#/d' input.txt
✅ 输出结果:
valid line

删除以 # 开头的注释行。


✅ 示例 12:给每行加行号(结合两个 sed 命令)

📄 原始内容(input.txt):
apple
banana
cherry
🔧 使用命令:
sed '=' input.txt | sed 'N;s/\n/ /'
✅ 输出结果:
1 apple
2 banana
3 cherry

给每行加上行号。


✅ 示例 13:提取两个关键字之间的内容

📄 原始内容(input.txt):
start_key
line one
line two
end_key
another line
🔧 使用命令:
sed -n '/start_key/,/end_key/p' input.txt
✅ 输出结果:
start_key
line one
line two
end_key

提取从 start_keyend_key 之间的段落。


✅ 示例 14:变量替换(配置文件更新)

📄 原始内容(config.ini):
server=127.0.0.1
port=8080
enabled=true
🔧 使用命令:
sed 's/^port=.*/port=9090/' config.ini
✅ 输出结果:
server=127.0.0.1
port=9090
enabled=true

替换配置文件中的端口号。


💾 五、保存修改

默认情况下,sed 不会修改原文件,只是输出结果。如果需要保存更改,可以结合重定向:

sed 's/old/new/g' input.txt > output.txt

或者使用 -i 参数直接修改原文件(慎用):

sed -i 's/old/new/g' input.txt

你可以添加 .bak 后缀来备份原文件:

sed -i.bak 's/old/new/g' input.txt

🧪 六、总结

sed 是 Linux 下非常实用的文本处理利器,掌握其基本命令和正则表达式技巧,可以大幅提升你在日常运维、日志分析、自动化脚本编写等方面的效率。

记住一句话:

grep 查找,sed 修改,awk 分析 —— 这就是 Linux 文本处理三剑客!

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐