sed命令详解

sed是 Linux/Unix 下的流编辑器,用于对输入流(文件或管道)进行非交互式的文本处理。

1 sed [选项] '命令' 输入文件
2 sed [选项] -f 脚本文件 输入文件

****选项:

-n     静默模式,只显示处理的行

-e     指定多个编辑命令

-f      从脚本文件读取命令

-i    直接修改源文件

-r /E  使用扩展正则表达式

****定位:

1 'n'          # 第n行
2 '$'          # 最后一行
3 '1,5'        # 1到5行
4 '/pattern/'  # 匹配pattern的行
5 '10,+5'      # 第10行及后面5行
6 '1~2'        # 从第1行开始,每隔2行(奇数行)

****基本编辑命令

 1 s/替换/内容/标志    # 替换
 2 p                 # 打印
 3 d                 # 删除
 4 a\text            # 行后追加
 5 i\text            # 行前插入
 6 c\text            # 替换整行
 7 y/源/目标/         # 字符转换(类似tr)
 8 r 文件             # 读取文件内容插入
 9 w 文件             # 将匹配行写入文件
10 q                 # 退出

****常见用法,其中s命令格式为:

sed 's/查找模式/替换内容/标志',标志-g为全局替换;数字N为替换第N次的匹配;P打印替换成功能行;w替换成功的行写入文件;I忽略大小写;# 基本替换(只替换每行第一个匹配)

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

# 全局替换(所有匹配)
sed 's/old/new/g' file.txt

# 替换第2行到最后一行的匹配
sed '2,$ s/old/new/g' file.txt

# 替换第3次出现的匹配
sed 's/old/new/3' file.txt

# 仅替换匹配 "pattern" 的行
sed '/pattern/s/old/new/g' file.txt

# 使用扩展正则表达式
sed -r 's/(ab)+/CD/g' file.txt

#& - 引用整个匹配
  echo "123 abc" | sed 's/[0-9]\+/[&]/g'
输出:[123] abc
  echo "price: 100" | sed 's/[0-9]\+/&美元/g' 
输出:price: 100美元

  #\1, \2, ... - 引用分组

  # 交换两个单词
    echo "hello world" | sed 's/\([^ ]\+\) \([^ ]\+\)/\2 \1/'
  # 或使用扩展正则(-r 或 -E)
    echo "hello world" | sed -r 's/([^ ]+) ([^ ]+)/\2 \1/'
  # 输出:world hello

  # 重排日期格式
    echo "2023-12-25" | sed -r 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\2\/\3\/\1/'
  # 输出:12/25/2023

****删除操作

# 删除第3行
sed '3d' file.txt

# 删除1-10行
sed '1,10d' file.txt

# 删除空行
sed '/^$/d' file.txt

# 删除注释行(以#开头)
sed '/^#/d' file.txt

# 删除包含 "error" 的行
sed '/error/d' file.txt

****打印操作

# 打印第5行
sed -n '5p' file.txt

# 打印1-10行
sed -n '1,10p' file.txt

# 打印匹配的行
sed -n '/pattern/p' file.txt

# 打印奇数行
sed -n '1~2p' file.txt

****插入/追加

# 在第3行前插入
sed '3i\插入的内容' file.txt

# 在第3行后追加
sed '3a\追加的内容' file.txt

# 在匹配行后追加
sed '/pattern/a\追加内容' file.txt

# 替换整行
sed '/pattern/c\新的整行内容' file.txt

****分组

# 交换前两个单词
sed -r 's/([^ ]+) ([^ ]+)/\2 \1/' file.txt

# 为数字添加括号
sed -r 's/([0-9]+)/[\1]/g' file.txt

****保存修改

# 直接修改源文件(先备份)
sed -i.bak 's/old/new/g' file.txt

# 仅修改(不备份)
sed -i 's/old/new/g' file.txt

# 修改多个文件
sed -i 's/old/new/g' *.txt

****实例

# 1. 删除文件中的Windows换行符(^M)
sed 's/\r$//' windows.txt > unix.txt

# 2. 每行行首添加行号
sed = file.txt | sed 'N;s/\n/ /'

# 3. 合并连续空行为一个空行
sed '/^$/{N;/^\n$/D}' file.txt

# 4. 将DOS格式转换为Unix格式
sed -i 's/\r//' file.txt

# 5. 提取两个标记之间的内容
sed -n '/BEGIN/,/END/p' file.txt

# 6. 在每行末尾添加句号
sed 's/$/。/g' file.txt

# 7. 转换大小写(GNU sed特有)
sed 's/.*/\L&/'   # 全转小写
sed 's/.*/\U&/'   # 全转大写

****调试技巧

# 先测试不修改文件
sed 's/pattern/replace/' file.txt

# 查看处理的行号
sed 's/pattern/replace/' file.txt | cat -n

# 使用 `&` 引用匹配的整个内容
sed 's/[0-9]*/[&]/g' file.txt

 

posted @ 2025-12-20 10:44  hopeccie  阅读(19)  评论(0)    收藏  举报