juechafun/05-原子化笔记本/Linux-sed-流式文本编辑器.md

136 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
#领域/Linux
#复盘/0
## 一句话描述
[____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,51到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替换整行