正确使用 git bash“find”和“sed”。我有最好的解决方案吗?

问题描述 投票:0回答:1

我在 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 覆盖文件。

但我觉得我让自己变得比需要的更加困难。所以我的问题是:我来这里的方法正确吗?有没有更简单的解决方案?

sed find git-bash
1个回答
0
投票

这可能对你有用(GNU sed 和 find):

find . -iregex ".*/.*\(h\|c\|hpp\|cpp\)$" \
       -exec sed  -Ei '\#^/\*+ ///_\|$#,\#^\*+/ //\|_/$#d' {} +

在 sed 命令中打开扩展正则表达式并修改文件就地选项。

使用范围来删除标题,但是为了让事情看起来更容易一些(也许?),请使用替代分隔符,即

\#...#,\#...#

注意用

+
结束 exec 命令,因为这可能更有效。

© www.soinside.com 2019 - 2024. All rights reserved.