Linux 文本处理技术指南:使用 grep, sed 和 find 进行批量文件操作
Linux 文本处理技术指南:使用 grep, sed 和 find 进行批量文件操作
Bin Lian本文档详细介绍了如何使用 Linux 命令行工具进行批量文件的文本处理操作,包括搜索与替换、删除特定内容以及处理多行模式等高级应用场景。
目录
基础工具介绍
在 Linux/Unix 环境中,文本处理主要依赖以下三个强大的命令行工具:
- find:用于在文件系统中查找文件
- grep:用于在文本中搜索指定的模式
- sed:流编辑器,用于转换和修改文本
这三个工具结合使用,可以实现复杂的批量文件操作,尤其适合科学计算、数据处理和代码管理等场景。
find 命令详解
find 命令用于在指定目录及其子目录中搜索文件。
基本语法
1 | find [路径] [选项] [表达式] |
常用选项
| 选项 | 说明 |
|---|---|
-name "模式" |
按文件名搜索,支持通配符 |
-type f/d |
指定搜索类型:f为文件,d为目录 |
-exec 命令 {} \; |
对找到的每个文件执行指定命令 |
-maxdepth N |
限制目录搜索深度 |
-mindepth N |
设置最小搜索深度 |
-size +/-N |
按文件大小搜索 |
-mtime +/-N |
按文件修改时间搜索 |
常见用法示例
1 | # 查找当前目录及子目录中所有.inp文件 |
grep 命令详解
grep 命令用于在文本文件中搜索指定的模式。
基本语法
1 | grep [选项] 模式 [文件...] |
常用选项
| 选项 | 说明 |
|---|---|
-i |
忽略大小写 |
-l |
只显示包含匹配的文件名 |
-r |
递归搜索子目录 |
-v |
反向匹配,显示不匹配的行 |
-n |
显示匹配行的行号 |
-E |
使用扩展正则表达式 |
-w |
匹配整个单词 |
-A N |
显示匹配行后的N行 |
-B N |
显示匹配行前的N行 |
常见用法示例
1 | # 在文件中搜索关键词 |
sed 命令详解
sed (Stream EDitor) 是一个强大的文本转换工具,可以对文本进行查找、替换、删除等操作。
基本语法
1 | sed [选项] '命令' 文件 |
常用选项
| 选项 | 说明 |
|---|---|
-i |
直接修改文件内容而不是输出到标准输出 |
-e |
执行多个命令 |
-n |
禁止自动打印模式空间 |
-r |
使用扩展正则表达式 |
常用命令
| 命令 | 说明 |
|---|---|
s/模式/替换/g |
全局替换文本 |
d |
删除匹配行 |
p |
打印匹配行 |
a\ |
在匹配行后追加文本 |
i\ |
在匹配行前插入文本 |
c\ |
替换整行 |
N |
将下一行加入到模式空间 |
n |
读取下一行,替换模式空间 |
多行处理语法
1 | /开始模式/{ |
常见用法示例
1 | # 替换文本 |
macOS 特别说明
macOS 中的 sed 基于 BSD 而不是 GNU,因此 -i 选项需要一个备份后缀(可以是空字符串):
1 | sed -i '' 's/B3LYP/PBE0/g' file.inp |
组合命令模式
结合 find、grep 和 sed 可以实现强大的批量文件处理功能。
通用模式
1 | find [路径条件] -exec grep [搜索条件] {} \; | xargs sed [文本操作] |
或者:
1 | find [路径条件] -exec sed [文本操作] {} \; |
应用场景
搜索并替换多个文件中的文本:
1
find . -name "*.inp" -type f -exec grep -l "B3LYP" {} \; | xargs sed -i 's/B3LYP/PBE0/g'
删除匹配文件中的特定行:
1
find . -name "*.inp" -type f -exec grep -l "关键词" {} \; | xargs sed -i '/关键词/d'
在匹配文件中添加内容:
1
find . -name "*.inp" -type f -exec grep -l "关键词" {} \; | xargs sed -i '/关键词/a\新增内容'
多行文本处理
处理跨越多行的文本块是一项高级功能,通常用于配置文件、源代码或结构化文档。
基本模式
1 | sed '/<开始标记>/{ |
工作原理
/<开始标记>/{ ... }- 当找到开始标记时执行花括号内的命令:a- 定义一个标签a用于循环N- 将下一行添加到模式空间(累积行)/<结束标记>/!ba- 如果还没有找到结束标记,则跳回标签a继续读取行- 最后对整个累积的文本块执行操作(替换、删除等)
实用案例
以下是针对计算化学文件的实际应用案例:
案例1:替换方法关键词
将所有.inp文件中的计算方法从B3LYP替换为PBE0:
1 | find . -name "*.inp" -type f -exec grep -l "B3LYP" {} \; | xargs sed -i 's/B3LYP/PBE0/g' |
macOS 版本:
1 | find . -name "*.inp" -type f -exec grep -l "B3LYP" {} \; | xargs sed -i '' 's/B3LYP/PBE0/g' |
案例2:删除多行属性块
删除特定的计算属性配置块:
1 | find . -name "*.inp" -type f -exec sed -i '/%elprop/{:a;N;/end/!ba;/Dipole true.*Quadrupole true.*Polar true/d}' {} \; |
macOS 版本:
1 | find . -name "*.inp" -type f -exec sed -i '' '/%elprop/{:a;N;/end/!ba;/Dipole true.*Quadrupole true.*Polar true/d}' {} \; |
案例3:删除含有可变内容的配置块
删除溶剂模型配置块,其中溶剂名称是可变的:
1 | find . -name "*.inp" -type f -exec sed -i '/%cpcm/{:a;N;/end/!ba;/smd true.*SMDsolvent/d}' {} \; |
macOS 版本:
1 | find . -name "*.inp" -type f -exec sed -i '' '/%cpcm/{:a;N;/end/!ba;/smd true.*SMDsolvent/d}' {} \; |
小结
通过掌握 find、grep 和 sed 这三个核心命令,可以高效地处理大量文本文件,特别是在科学计算和数据处理领域。多行模式处理虽然语法较为复杂,但能够处理结构化文档中的复杂模式,大大提高文本处理的灵活性和效率。
感谢你赐予我前进的力量|Thank you for your support!
赞赏者名单|List of supporters
因为你们的支持让我意识到写文章的价值🙏
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果












