使用Bash脚本替换文本文件中的特殊字符
Bash脚本实现多规则文本查找替换
嘿,我来帮你把这些文本替换需求转化成实用的Bash脚本,还给你拆解每个步骤的逻辑——毕竟替换顺序可是关键,搞反了很容易出奇怪的结果!
完整脚本示例
下面是直接能用的脚本,我已经按合理的顺序把你的所有替换规则都整合进去了:
#!/bin/bash # 检查用户是否提供了输入文件 if [ $# -ne 1 ]; then echo "用法: $0 <输入文件路径>" echo "示例: ./text_replace.sh my_data.txt > cleaned_data.txt" exit 1 fi input_file="$1" # 执行一系列替换操作,结果输出到标准输出 sed -e ':a;N;$!ba;s/\n/ /g' \ -e 's/CP/\n/g' \ -e 's/Mr. Mime/Mr.Mime/g' \ -e 's/\t/ /g' \ -e ':b;s/ / /;tb' \ -e 's/%//g' \ -e 's/ ATK DEF STA IV / /g' \ "$input_file"
替换规则拆解与顺序原因
我特意按逻辑优先级排好了替换顺序,给你逐个解释:
- 将换行符替换为空格:用
':a;N;$!ba;s/\n/ /g'这个技巧,它会把整个文件内容一次性读入缓冲区(避免sed默认逐行处理的限制),然后把所有换行符换成空格。这一步必须放最前面,因为后续很多替换需要处理跨行的内容。 - 将CP替换为换行符:等所有换行都变成空格后,再把标记性的
CP换成换行,这样能重新把文本组织成你需要的行结构。 - 替换Mr. Mime为Mr.Mime:直接匹配带空格的目标字符串,替换成无空格版本,这一步不依赖其他操作,放在这里刚好。
- 制表符替换为空格:把所有制表符统一换成空格,方便后续统一处理空格相关的规则。
- 双空格替换为单空格:用
':b;s/ / /;tb'循环替换,直到文本中没有连续的双空格——这比单次替换s/ / /g更彻底,能处理三个甚至更多连续空格的情况。 - 删除%字符:直接匹配
%并替换为空,一次性移除所有该字符。 - 替换" ATK DEF STA IV "为空格:精准匹配这段固定文本,替换成单个空格,避免残留多余的空白内容。
使用方法
- 把上面的代码保存为
text_replace.sh文件 - 给脚本添加执行权限:
chmod +x text_replace.sh - 运行脚本处理文件:
./text_replace.sh 你的输入文件名.txt > 清理后文件名.txt(用>把结果输出到新文件,不会修改原文件)
扩展提示
如果后续有更多替换需求,只需要在sed的参数里添加新的-e 's/要查找的内容/替换后的内容/g'即可。比如你要替换XYZ为ABC,就加一行-e 's/XYZ/ABC/g',注意调整顺序——如果新的替换依赖前面的处理结果,就放在对应的位置。
内容的提问来源于stack exchange,提问作者zotteken
相关产品推荐
相关产品推荐

