Linux命令:sed命令高级用法详解
作者:管理员 来源:互联网 发布时间:2025-12-23 10:10:42 点击数:0
sed(Stream EDitor)是Linux中一个功能强大的流式文本编辑器,它按行处理文本,非常适合文本替换、删除、插入和转换等任务。sed是一种流编辑器,它是文本处理中非常强大的工具,能够完美的配合正则表达式使用,用法简单实用,非常灵活。
一、基本语法和工作原理
sed [选项] '命令' 文件 sed [选项] -f 脚本文件 文件
工作原理:
读取文件的一行到模式空间(临时缓冲区)
执行sed命令处理模式空间的内容
将处理后的内容输出到标准输出
重复直到文件结束
二、常用选项
| 选项 | 说明 |
|---|---|
-n | 静默模式,只显示处理过的行 |
-e | 允许多个命令串联 |
-f | 从脚本文件读取命令 |
-i | 直接修改源文件(危险但实用) |
-r | 使用扩展正则表达式 |
三、核心命令详解
1. 替换命令(最常用)
# 基本格式 s/pattern/replacement/flags # 示例 sed 's/old/new/' file.txt # 每行第一个old替换为new sed 's/old/new/g' file.txt # 全局替换 sed 's/old/new/2' file.txt # 每行第二个old替换 sed 's/old/new/ig' file.txt # 忽略大小写并全局替换 sed 's|/usr/bin|/usr/local/bin|' # 使用不同分隔符
2. 删除命令
sed '3d' file.txt # 删除第3行 sed '1,5d' file.txt # 删除1-5行 sed '/pattern/d' file.txt # 删除匹配行 sed '/start/,/end/d' # 删除start到end之间的行 sed '$d' file.txt # 删除最后一行
3. 插入和追加
sed '3i\插入的内容' file.txt # 在第3行前插入 sed '3a\追加的内容' file.txt # 在第3行后追加 sed '/pattern/i\插入' file.txt # 在匹配行前插入 sed '/pattern/a\追加' file.txt # 在匹配行后追加
4. 打印命令
sed -n '3p' file.txt # 只打印第3行 sed -n '1,5p' file.txt # 打印1-5行 sed -n '/pattern/p' file.txt # 打印匹配行 sed -n '3,5!p' file.txt # 打印除了3-5行的内容
5. 替换行内容
sed '3c\新行内容' file.txt # 替换第3行 sed '/pattern/c\新内容' file.txt # 替换匹配行
四、高级功能
1. 地址范围
sed '10,20s/old/new/g' # 只在10-20行替换 sed '/start/,/end/s/old/new/g' # 在匹配范围替换 sed '5,$s/old/new/g' # 从第5行到文件末尾
2. 多点编辑
# 多个命令用分号分隔 sed -e 's/old/new/g' -e '/foo/d' file.txt # 或者 sed 's/old/new/g; /foo/d' file.txt
3. 分组和反向引用
# 使用括号分组,\1、\2引用 sed 's/\([0-9]*\)-\([0-9]*\)/\2:\1/' # 123-456 → 456:123 sed -r 's/([0-9]*)-([0-9]*)/\2:\1/' # 扩展正则写法
4. 保持空间和模式空间
g # 用保持空间内容替换模式空间 G # 将保持空间内容追加到模式空间 h # 用模式空间内容替换保持空间 H # 将模式空间内容追加到保持空间 x # 交换两个空间的内容
五、实用示例
1. 文件操作
# 原地修改文件(先备份) sed -i.bak 's/old/new/g' file.txt # 删除空行 sed '/^$/d' file.txt # 删除注释行和空行 sed -e '/^#/d' -e '/^$/d' file.conf # 每行行首添加内容 sed 's/^/# /' file.txt # 每行行尾添加内容 sed 's/$/ --- end/' file.txt
2. 数据处理
# 提取特定行 sed -n '5,10p' data.txt > output.txt # 替换CSV文件中的分隔符 sed 's/,/|/g' data.csv # 格式化文本 sed 's/^ *//' file.txt # 删除行首空格 sed 's/ *$//' file.txt # 删除行尾空格
3. 日志处理
# 提取时间范围内的日志 sed -n '/2024-01-01 10:00:00/,/2024-01-01 11:00:00/p' app.log # 删除包含敏感信息的行 sed '/password/d;/secret/d' log.txt
4. Shell脚本结合
# 在脚本中使用变量 old="foo" new="bar" sed "s/$old/$new/g" file.txt # 处理命令输出 ps aux | sed '/grep/d' | sed 's/ */ /g'
六、注意事项和技巧
1.特殊字符转义
# 替换包含斜杠的字符串 sed 's/\/path\/to\/old/\/new\/path/g' # 繁琐 sed 's|/path/to/old|/new/path|g' # 更好 # 替换包含分隔符的字符串 sed 's|/usr/local/bin|/opt/bin|g'
2. 性能优化
# 1. 使用地址限制操作范围 sed '1,1000s/old/new/g' # 只在1-1000行操作 # 2. 合并多个命令 sed -e 's/old/new/g' -e '/pattern/d' # 优于多次调用sed # 3. 避免不必要的正则表达式 sed 's/old/new/' # 简单字符串时不需要正则
3. 调试技巧
# 1. 先测试不使用-i sed 's/old/new/g' file.txt > test.txt # 2. 使用l命令查看特殊字符 sed -n '1,5l' file.txt # 3. 逐步添加复杂表达式 sed 's/pattern/replace/' # 先测试基础 sed 's/pattern/replace/g' # 添加全局标志 sed -r 's/(group)/replace/g' # 添加正则分组
七、常见问题解决
1.处理大文件
# 使用地址范围分块处理 sed -i '1,50000s/old/new/g' bigfile.txt sed -i '50001,100000s/old/new/g' bigfile.txt
2. 跨行匹配(sed的局限性)
# sed默认不支持跨行匹配,可用以下技巧: sed ':a;N;$!ba;s/\n/ /g' # 将多行合并为一行
3. 备份策略
# 总是先备份 cp file.txt file.txt.bak sed -i 's/old/new/g' file.txt # 或者使用sed的备份功能 sed -i.bak 's/old/new/g' file.txt
sed虽然强大,但语法有些晦涩。建议:
复杂操作先用简单文件测试
重要文件操作前一定备份
对于特别复杂的文本处理,考虑awk或Perl
将常用sed命令保存为脚本或别名
上一篇:在IIS上配置X-Forwarded-For防护
下一篇:Linux命令:ipconfig与ifconfig命令用法及区别
