linux的sed怎么用

发布时间:2022-02-19 09:29:02 作者:小新
来源:亿速云 阅读:174
# Linux的sed命令详解:从入门到精通

## 一、sed简介

`sed`(Stream EDitor)是Linux/Unix系统中强大的**流式文本编辑器**,它以行为单位处理文本,执行查找、替换、删除、插入等操作而不改变原始文件。与交互式编辑器(如vim)不同,sed通过脚本指令自动处理文本流,特别适合批量编辑和大文件处理。

### 核心特性
- **非交互式**:通过命令参数或脚本文件操作
- **流水线处理**:可无缝衔接其他命令(grep/awk等)
- **保持原文件**:默认输出到stdout,需`-i`参数才修改源文件
- **支持正则**:强大的模式匹配能力

## 二、基础语法结构

```bash
sed [选项] '地址范围/操作/修饰符' 文件名

常用选项

选项 作用
-n 禁止默认输出,常与p命令配合
-i 直接修改文件内容(危险操作建议先备份)
-e 连接多个编辑命令
-f 指定sed脚本文件

命令执行流程

  1. 读取一行到模式空间(Pattern Space)
  2. 按顺序执行所有sed命令
  3. 输出处理后的内容
  4. 重复直到文件结束

三、核心操作命令

1. 替换操作(s命令)

最常用的文本替换操作:

sed 's/old/new/' file.txt          # 每行第一个匹配
sed 's/old/new/g' file.txt         # 全局替换
sed 's/old/new/2' file.txt         # 仅替换每行第2个匹配
sed 's/old/new/ig' file.txt        # 忽略大小写并全局替换

特殊分隔符

当替换内容包含/时,可使用其他分隔符:

sed 's|/usr/bin|/usr/local/bin|g'

2. 删除操作(d命令)

sed '3d' file.txt           # 删除第3行
sed '1,5d' file.txt         # 删除1-5行
sed '/pattern/d' file.txt   # 删除匹配行
sed '/^$/d' file.txt        # 删除所有空行

3. 打印操作(p命令)

sed -n '1,3p' file.txt      # 仅打印1-3行
sed -n '/error/p' log.txt   # 打印所有包含error的行

4. 插入与追加

sed '2i\插入内容' file.txt    # 在第2行前插入
sed '$a\追加内容' file.txt    # 在最后一行后追加

四、高级用法技巧

1. 地址范围选择

sed '10,20s/old/new/' file.txt      # 仅处理10-20行
sed '/start/,/end/d' file.txt       # 删除两个模式间的所有行
sed '5,+3s/old/new/' file.txt       # 从第5行开始的4行

2. 多点编辑

sed -e 's/foo/bar/' -e '/baz/d' file.txt

3. 引用匹配内容

使用&引用匹配到的整个内容:

echo "123" | sed 's/[0-9]*/& &/'    # 输出 "123 123"

4. 分组捕获

通过\(\)捕获分组,用\1,\2引用:

echo "hello world" | sed 's/\(hello\) \(world\)/\2 \1/'
# 输出 "world hello"

5. 保持空间操作

命令 作用
h/H 复制/追加模式空间到保持空间
g/G 复制/追加保持空间到模式空间
x 交换两个空间内容

示例(反转文件行序):

sed -n '1!G;h;$p' file.txt

五、实战案例集锦

1. 日志处理

# 提取nginx日志中所有404错误
sed -n '/ 404 /p' access.log

# 替换日期格式(MM/DD/YYYY => YYYY-MM-DD)
sed 's#\([0-9]\{2\}\)/\([0-9]\{2\}\)/\([0-9]\{4\}\)#\3-\1-\2#' dates.txt

2. 配置文件修改

# 注释掉配置文件中的某行
sed -i '/^OPTION/s/^/#/' config.ini

# 取消注释
sed -i '/^#OPTION/s/^#//' config.ini

3. 代码格式化

# 删除C/C++代码中的注释(简易版)
sed -e 's/\/\/.*$//' -e 's/\/\*.*\*\///g' source.cpp

4. CSV文件处理

# 交换第2列和第3列
sed 's/\([^,]*\),\([^,]*\),\([^,]*\)/\1,\3,\2/' data.csv

六、注意事项与排错

  1. 备份习惯:使用-i前建议:

    sed -i.bak 's/old/new/' file.txt
    
  2. 特殊字符转义

    sed 's/\/path\/to\/dir/\/new\/path/'  # 正确转义/
    sed 's|/path/to/dir|/new/path|'       # 更推荐换分隔符
    
  3. 行尾问题:Windows文件需先转换:

    dos2unix file.txt
    
  4. 性能优化

    • 对大文件避免使用-i,可重定向到新文件
    • 复杂操作建议使用sed脚本文件(-f参数)

七、与awk的对比选择

特性 sed awk
设计目的 文本替换/编辑 文本分析/报告生成
处理单位 行+字段
编程能力 有限 完整编程语言(变量/循环等)
适用场景 简单替换、批量编辑 复杂格式转换、数据统计

组合使用示例

# 统计日志中每个IP出现的次数
grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access.log | 
  sed 's/^ *//;s/ *$//' | 
  awk '{count[$1]++} END{for(ip in count) print ip,count[ip]}'

八、扩展资源

  1. 官方文档:

    info sed  # 详细手册
    
  2. 推荐书籍:

    • 《sed and awk》by Dale Dougherty
    • 《Linux命令行与Shell脚本编程大全》
  3. 在线练习:

掌握sed需要不断实践,建议在日常工作中遇到文本处理任务时,优先考虑用sed解决,逐步积累经验。记住:任何需要手动重复编辑的操作,都应该尝试用sed自动化! “`

这篇文章共计约2100字,采用Markdown格式编写,包含: 1. 多级标题结构 2. 代码块与表格展示 3. 实际应用案例 4. 注意事项提示 5. 扩展学习资源 可根据需要调整内容细节或添加更多示例。

推荐阅读:
  1. Linux中Sed命令怎么用?
  2. linux中的sed是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

sed linux

上一篇:grep正则表达式是什么

下一篇:awk命令如何使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》