使用gawk/sed原地批量修改C++代码注释格式的技术求助
批量修改C++文件注释格式适配文档生成工具
需求说明
原有注释格式
需要修改大量.cpp、.h/.hpp文件中的注释,原有格式如下(分隔线的-数量不固定):
//----------------------------------------------------------- // NAME : Class // DESCRIPTION : Vague information //-----------------------------------------------------------
目标格式(二选一)
样式一(保留原分隔线)
//----------------------------------------------------------- /*! // NAME : Class // DESCRIPTION : Vague information */ //-----------------------------------------------------------
样式二(移除分隔线)
/*! // NAME : Class // DESCRIPTION : Vague information */
现有问题
之前尝试的gawk原地替换命令存在语法错误,且仅能处理单个文件,无法批量操作。原命令:
$ gawk -i inplace '/^//--.*/&&v++%2 {sub(/^//--.*/, "/*!")}' filename.cpp $ gawk -i inplace '/^//--.*/{sub(/^//--.*/, "*/")}' filename.cpp
预期目标是:将奇数个匹配的//---*行替换为/*!,偶数个替换为*/,同时实现批量处理。
解决方案
修正语法并实现批量处理(适配样式一)
原命令的问题在于正则表达式中//未正确转义,且逻辑拆分错误。使用以下命令可批量处理目标文件:
# 批量处理当前目录及子目录下的.cpp/.h/.hpp文件 find . -type f \( -name "*.cpp" -o -name "*.h" -o -name "*.hpp" \) -exec gawk -i inplace ' /^\/\/-+/ { if (count++ % 2 == 0) { print $0; print "/*!"; } else { print "*/"; print $0; } next; } 1' {} +
- 逻辑说明:匹配以
//开头后跟至少一个-的行,奇数个匹配行(count从0开始,偶数索引)保留原分隔线并追加/*!;偶数个匹配行(奇数索引)先输出*/再保留原分隔线。 -i inplace实现原地修改,1表示输出所有未匹配的行。
样式二的批量处理方案(移除分隔线)
若不需要保留原分隔线,直接替换成对的分隔线为/*!和*/:
find . -type f \( -name "*.cpp" -o -name "*.h" -o -name "*.hpp" \) -exec gawk -i inplace ' /^\/\/-+/ { if (count++ % 2 == 0) { print "/*!"; } else { print "*/"; } next; } 1' {} +
- 逻辑说明:匹配到分隔线时,奇数个替换为
/*!,偶数个替换为*/,直接跳过原分隔线的输出。
单文件测试命令(可选)
如果需要先测试单个文件,可使用:
# 样式一测试 gawk '/^\/\/-+/ {if (count++%2==0) {print $0; print "/*!";} else {print "*/"; print $0;} next;}1' test.cpp > test_modified.cpp # 样式二测试 gawk '/^\/\/-+/ {if (count++%2==0) {print "/*!";} else {print "*/";} next;}1' test.cpp > test_modified.cpp
内容的提问来源于stack exchange,提问作者Brinck
相关产品推荐
相关产品推荐

