如何使用Bash为C++源文件添加多行自定义头部内容
解决方案
原有写法使用sed的行首替换逻辑无法正确处理带换行的变量,换行符会被sed识别为命令分隔符,导致最终插入的内容变成单行。
推荐修改方案
方案1:使用sed插入命令(适配GNU sed,大部分Linux发行版默认)
变量定义不需要修改:
h=$'//Copyright 2021 My Corporation\n//Authors: me and others\n'
推荐直接用find + exec写法,避免文件名带空格、特殊字符时执行异常:
find . -name '*.h' -o -name '*.cpp' -exec sed -i "1i\\ $h" {} \;
如果要保留原来的for循环写法,注意给文件名变量加引号:
for f in $(find . -name '*.h' -or -name '*.cpp'); do sed -i "1i\\ $h" "$f" done
方案2:awk实现(跨平台兼容性更好,适配macOS/BSD环境)
如果是macOS等自带BSD sed的环境,用awk实现可以避免语法差异问题:
h=$'//Copyright 2021 My Corporation\n//Authors: me and others\n' find . -name '*.h' -o -name '*.cpp' | while read -r f; do tmp=$(mktemp) awk -v header="$h" 'NR==1{print header}1' "$f" > "$tmp" && mv "$tmp" "$f" rm -f "$tmp" done
注意事项
- macOS自带的BSD sed使用
-i参数时需要额外指定备份后缀,不需要备份的话填空字符串即可,示例:sed -i '' "1i\\$h" "$f" - 所有文件名变量一定要加双引号,避免文件名带特殊字符时执行报错
内容的提问来源于stack exchange,提问作者Dmitriano
相关产品推荐
相关产品推荐

