如何使用GNU sed正则删除main开头带花括号的代码块?
错误原因
- 转义左花括号
\{触发报错:GNU sed 默认使用基础正则表达式(BRE)语法,\{在BRE中是范围量词的起始标识(用于类似a\{1,3\}的量词写法),单独写\{没有后续数字范围定义时会触发正则语法错误。 - 不转义花括号时未匹配到目标块:原有规则
^main.*{没有限制main和{之间的字符类型,大概率是文件中main和{之间的空白格式和预期不符,导致匹配失败。
正确实现命令
推荐使用GNU sed的扩展正则参数-E简化写法,语法更清晰不易出错:
find . -name "*.html" -type f -exec sed -E -i '/^main[[:space:]]*{/,/^}/d' {} +
规则说明:
-E开启扩展正则表达式支持,普通{字符不需要额外转义- 起始匹配
/^main[[:space:]]*{/:匹配行首为main,后接任意数量空白(空格/制表符),再接左花括号的行 - 结束匹配
/^}/:匹配行首仅包含右花括号的行 - 起止规则之间的逗号表示匹配两个行之间的所有内容(包含起止行),
d命令删除所有匹配到的内容
安全操作建议
修改前可以先给文件生成备份,确认修改正确后再清理备份,避免误操作丢失数据:
# 带备份修改,会为每个html文件生成同名.bak备份 find . -name "*.html" -type f -exec sed -E -i.bak '/^main[[:space:]]*{/,/^}/d' {} + # 确认修改无误后,批量删除备份文件 find . -name "*.html.bak" -type f -delete
内容的提问来源于stack exchange,提问作者Ed S.
相关产品推荐
相关产品推荐

