
---
#领域/Linux 

#复盘/2

## 一句话描述

[____sed 使用说明____]

---

## 核心规范

>空想不如行动，积累胜于苛求。
>实践 > 沉淀 > 完美主义

实践不是盲目行动，而是带着“小目标、可验证“的方向试错，实践后必须沉淀（比如记录问题、总结规律），否则就是低水平重复。

实践大于沉淀，沉淀大于完美；完美是沉淀的终局方向，沉淀是实践的复盘产物；分域施策，避坑落地，始于行动，终于迭代。

---

## 三省沉淀法

- 达成了[_命令行查找替换文件内容_______]目标
- 遇到了[__正则总是难以理解______]问题
- 下次改进[__提供正则模板、了解正则语法______]

## 个人理解

[___命令行的查找、替换功能_____]

## 实践计划

1. [__编写匹配模板______]
2. [_了解正则使用_______]
3. [________]

## 核心定义

sed = **`Stream Editor`**（流编辑器），是**面向「文本流」的非交互式文本编辑工具**。

核心工作原理：逐行编辑，循环执行，不提取/计算

1. 读取一行内容
2. 内容复制到 sed 模式空间（内存临时缓冲区，即不操作源文件）
3. 执行 sed 编辑命令（替换、删除、插入等），只修改模式空间里的内容
4. 模式空间输出处理后的内容到屏幕，读取下一行，重复1-4


### 黄金规则

1. sed 默认不修改源文件，只修改内存副本，结果输出到屏幕
2. sed 默认输出所有行，不管有没有编辑过，相当于所有内容


### 基本语法：sed 's/hello/world/g'

```bash

# 格式：前置命令 | sed 'sed的编辑命令'
cat test.txt | sed 's/hello/world/'

ps -ef | sed '/java/d'

find . -name "*.sh" | xargs sed 's/\/bin\/sh/\/bin\/bash/'

sed 's/80/8080/' nginx.conf
sed '/^$/d' app.log

```

```bash
# 直接修改源文件
sed -i.bak 's/old/new/' test.txt

sed -n '/java/p' ps.txt

sed -e '/^$/d' -e 's/80/8080/' -e '/DEBUG/d' app.log

```

| 选项     | 说明           |
| ------ | ------------ |
| -i     | 原地修改文件       |
| -i.bak | 修改源文件 + 自动备份 |
| -n     | 静默输出被匹配的行    |
| -e     | 多个命令按顺序执行    |

### 核心编辑命令

行号匹配：2（第2行）、1,5（1到5行）、$（最后一行)
正则匹配：/关键词/、/^$/（匹配空行）、/^#/（匹配以#开头的注释行)

```bash

# s 字符串替换
sed 's/旧字符串/新字符串/修饰符' 文件名

# \1 为捕获组，即第一个正则()内容
sed -i.bak 's/\([0-9]\+\)号点位:/# \1号点位\n\1:/g' test.txt


# d 删除指定行
# -i 是才会修改源文件
sed '2d' test.txt

sed '/^$/d' test # 删除空行
sed '/^#/d' test.txt # 删除注释行

# p 打印指定行
# 必须搭配 -n 使用
sed -n '3p' test.txt

# 第 5 行下追加内容
sed '5a 内容' 

# 第 5 行上插入内容
sed '5i 内容'

```


- s：声明是替换操作
- /：分隔符
- 修饰符：
    - g：全局替换，默认只匹配每行第一个，加g会匹配一行中所有
    - i：忽略大小写
    - p：打印匹配到的行，必须搭配 -n 使用
- 自定义分隔符：@、#、|
- a：下一行追加
- i：上一行插入
- c：替换整行

