如何用Bash脚本高效删除文件首尾外层方括号并保留嵌套内容
Bash删除文件外层方括号的实现方案
核心实现命令
直接替换你需要的magicCommand即可,适配绝大多数默认带Perl的Linux/macOS环境:
perl -0777 -pe 's/(.*?)\[/$1/s; s/(.*)\]/$1/s'
命令说明
-0777:开启slurp模式,将整个文件内容一次性读入为单个字符串,天然支持跨多行匹配- 第一个替换规则
s/(.*?)\[/$1/s:非贪婪匹配从文件开头到第一个[的所有内容,保留[之前的所有字符(包括空白、换行),仅删除第一个[;末尾的s修饰符让.可以匹配换行符 - 第二个替换规则
s/(.*)\]/$1/s:贪婪匹配从文件开头到最后一个]的所有内容,保留]之前的所有内容,仅删除最后一个]
特性说明
- 完全保留第一个
[前、最后一个]后的所有空白字符、换行符 - 内部嵌套的方括号、跨多行内容不会被修改
- 普通文件场景下处理效率高,无额外依赖
测试验证
测试file1
执行命令:
cat file1 | perl -0777 -pe 's/(.*?)\[/$1/s; s/(.*)\]/$1/s'
输出结果:
Lorem ipsum [dolor] sit [amet conse] sadip elitr
测试file2
执行命令:
cat file2 | perl -0777 -pe 's/(.*?)\[/$1/s; s/(.*)\]/$1/s'
输出结果:
Lorem ipsum [dolor] sit [amet conse] sadip elitr
可选GNU awk实现(无Perl环境可用)
如果环境中没有Perl,可以用以下awk命令实现相同效果:
awk '{buf = buf $0 ORS} END { if (match(buf, /\[/)) buf = substr(buf, 1, RSTART-1) substr(buf, RSTART+1) if (match(buf, /.*\]/)) buf = substr(buf, 1, RLENGTH-1) substr(buf, RLENGTH+1) printf "%s", buf }'
内容的提问来源于stack exchange,提问作者jpseng
相关产品推荐
相关产品推荐

