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

3.2 KiB
Raw Permalink Blame History


#领域/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'


# 格式:前置命令 | 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

# 直接修改源文件
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行、$(最后一行) 正则匹配:/关键词/、/^$/(匹配空行)、/^#/(匹配以#开头的注释行)


# 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替换整行