我在 Windows 上使用 git bash。
我有一大组(数千个)c/c++ 文件,其中包含我想要替换的自动生成的标头。我的计划是首先删除标题,然后应用新的标题。
这些标题遵循以下模式:
/************************************************************************************ ///_|
File: $Id: //perforcedepot/path/filename.ext#1 $
LEGAL NOTICE: COPYRIGHT YYYY by COMPANY NAME, All Rights Reserved
*************************************************************************************/ //|_/
我做了一些实验并想出了这个:
sed '/\/\*\*\*\*\*\*\*\*\*/,/\/ \/\/\|\_\//d' filename.ext
看起来足够好,但我想知道是否有更优雅的方式来进行匹配?
另外,我用 find 测试了它,如下所示:
find . -iregex '.*\.\(h\|c\|hpp\|cpp\)$' -exec sed '/\/\*\*\*\*\*\*\*\*\*/,/\/ \/\/\|\_\//d' {} \;
似乎根据一个小测试样本选取了正确的文件。
我现在的计划是添加“-i”以使 sed 覆盖文件。
但我觉得我让自己变得比需要的更加困难。所以我的问题是:我来这里的方法正确吗?有没有更简单的解决方案?
这可能对你有用(GNU sed 和 find):
find . -iregex ".*/.*\(h\|c\|hpp\|cpp\)$" \
-exec sed -Ei '\#^/\*+ ///_\|$#,\#^\*+/ //\|_/$#d' {} +
在 sed 命令中打开扩展正则表达式并修改文件就地选项。
使用范围来删除标题,但是为了让事情看起来更容易一些(也许?),请使用替代分隔符,即
\#...#,\#...#
。
注意用
+
结束 exec 命令,因为这可能更有效。