1. Sed 文本处理命令
# 删除包含 ICON="..." 的行
sed -i '/ICON="[^"]*"/d' "aa.html"
# 提取包含 ICON="..." 的行并保存到 bb.html
sed -n '/ICON="[^"]*"/p' aa.html > bb.html
# 删除行内的 ICON="..." 部分
sed -i 's/ICON="[^"]*"//g' "aa.html"
Linux 文本处理命令笔记
一、删除文件中的 ICON="..." 内容
问题描述
文件中包含 ICON="data:image/png;base64,xxx" 格式的内容,需要删除这部分。
解决方案
1. 使用 sed 命令(推荐)
# 基本删除
sed -i 's/ICON="[^"]*"//' 文件名
# 同时删除后面的空格
sed -i 's/ICON="[^"]*" *//' 文件名
# 全局匹配(推荐)
sed -i 's/ICON="[^"]*" *//g' 文件名
# 使用扩展正则表达式
sed -i -E 's/ICON="[^"]*"//' 文件名
2. 使用 awk 命令
awk '{gsub(/ICON="[^"]*"/, ""); print}' 文件名 > 临时文件 && mv 临时文件 文件名
3. 使用 perl 命令
perl -pi -e 's/ICON="[^"]*"//' 文件名
注意事项
-i 参数会直接修改原文件,建议先备份:cp 文件名 文件名.bak- 不确定时先去掉
-i 测试
二、sed 与 perl 的区别
设计理念
| 工具 | 定位 | 特点 |
|---|
| sed | 专门的流编辑器 | 轻量、快速、系统预装 |
| perl | 通用编程语言 | 功能强大、正则引擎完善 |
正则表达式能力对比
| 特性 | sed | perl |
|---|
| 标准正则 | ✓ | ✓ |
| 非贪婪匹配 | 有限支持 | ✓ |
| 零宽断言 | ✗ | ✓ |
| 递归匹配 | ✗ | ✓ |
典型使用场景
sed 适合:
- 简单的查找替换
- 删除/插入行
- 提取特定行范围
- 快速文本过滤
sed '/^$/d' file.txt # 删除空行
sed '3,5d' file.txt # 删除3-5行
sed 's/^[ \t]*//' file.txt # 删除前导空白
perl 适合:
- 复杂正则表达式匹配
- 多行模式处理
- 需要编程逻辑的场景
- 数据转换和报表生成
perl -0777 -pe 's/start.*?end//gs' file.txt # 跨行非贪婪匹配
perl -ne '$sum += $_; END {print $sum}' # 求和计算
选择建议
| 场景 | 推荐工具 | 原因 |
|---|
| 简单替换 | sed | 快速、轻量、预装 |
| 复杂正则 | perl | 正则引擎更强大 |
| 单行处理 | sed | 性能好 |
| 需要变量/循环 | perl | 完整编程能力 |
| 嵌入式系统 | sed | 体积小,无需安装 |
三、sed 命令中 g 标志的作用
区别说明
| 命令 | 行为 |
|---|
sed 's/pattern/replacement/' | 只替换每行第一个匹配 |
sed 's/pattern/replacement/g' | 替换每行所有匹配 |
示例演示
# 输入:ICON="data1" xxx ICON="data2" yyy
# 不加 g(只删除第一个)
sed 's/ICON="[^"]*" *//'
# 结果:xxx ICON="data2" yyy
# 加 g(删除所有)
sed 's/ICON="[^"]*" *//g'
# 结果:xxx yyy
在你的场景中
由于一行通常只有一个 ICON="...",加不加 g 结果相同,但推荐加 g 养成习惯,更安全。
四、正则表达式 "[^"]*" * 详解
逐字符解析
| 符号 | 含义 | 说明 |
|---|
" | 匹配双引号 | 开始引号 |
[^"] | 匹配非双引号的任意字符 | ^ 表示"非" |
* | 匹配0次或多次 | 贪婪匹配 |
" | 匹配双引号 | 结束引号 |
| 空格 | 匹配空格字符 | 字面空格 |
* | 匹配0次或多次 | 匹配后面的空格 |
可视化理解
"[^"]*" *
│ ││ │ │
│ ││ │ └─ 匹配0个或多个空格
│ ││ └─── 结束引号
│ │└───── 匹配0个或多个非引号字符
│ └────── 字符集:除双引号外的任何字符
└──────── 开始引号
匹配示例
| 输入 | 匹配结果 | 说明 |
|---|
"hello" | "hello" | 无空格,*匹配0次 |
"hello" | "hello" | 匹配1个空格 |
"hello" | "hello" | 匹配2个空格 |
"hello world" | "hello world" | 内部空格不影响 |
"a"b"c" | "a" | 遇到第二个引号停止 |
常见变体
# 匹配0个或多个空格
" *"
# 匹配1个或多个空格
" +"
# 匹配0个或多个空白字符(空格、tab等)
"\s*"
# 匹配前后的空格
' *ICON="[^"]*" *'
# 处理 ICON = "..." 格式
'ICON\s*=\s*"[^"]*"\s*'
五、常用命令速查表
| 功能 | 命令 |
|---|
| 删除 ICON="..." | sed -i 's/ICON="[^"]*" *//g' 文件 |
| 删除空行 | sed -i '/^$/d' 文件 |
| 删除行首空格 | sed -i 's/^[ \t]*//' 文件 |
| 删除行尾空格 | sed -i 's/[ \t]*$//' 文件 |
| 备份后编辑 | cp 文件 文件.bak && sed -i 's/old/new/g' 文件 |