0

我有许多 .cpp 和 .hpp 文件,其中包含一个#include“my.hpp”,我想将其移动到每个文件中,使其成为最后一个包含,如下所示:

当前的:

#include "my.hpp"
#include "foo.hpp"
#include "bar.hpp"

或者

#include "whatever.hpp"
#include "my.hpp"
#include "bar.hpp"

需要:

#include "whatever.hpp"
#include "something.hpp"
#include "my.hpp"

谢谢!

4

3 回答 3

2

你可以使用 find 和 perl:

find . -name "*.?pp" -exec perl -0777 -pi -e 's/(#include "my.hpp"\n)((#include .*\n)*)/$2$1/g' {} \;

e:忘记添加-0777(启用多行)

于 2013-04-10T07:45:43.753 回答
0

我没有时间编写完整的脚本,但这里有一个想法:

  1. 运行grep以仅查找包含的文件#include "my.hpp"并仅在这些文件上运行以下阶段
  2. 使用类似的东西剪切有问题的包含行sed 's/#include "my.hpp"'//
  3. tac使用and查找最后一个包含行sed并将其附加到您的包含行 - 有关详细信息,请参阅此问题和接受的答案。我猜是这样的

    tac | sed 's/^\(#include .*\)$/\1\n#include "my.hpp"/q' | tac

详细信息可能取决于您的确切文件,所以 YMMV。

于 2013-04-10T07:34:09.753 回答
0

这可能对您有用(GNU sed):

sed -rsi '/^#include\b/!b;:a;/#include\b[^\n]*$/{$bb;N;ba};:b;s/(#include my.hpp"\n)(.*)(#include\b[^\n]*\n)/\3\2\1/' file1 file2 filen

这假定它们#includes是连续的并且不是文件中的最后一个条目。

于 2013-04-10T08:45:33.547 回答