2013-04-10 134 views
0

我有许多包含一个#include“my.hpp”我想把它移到每个文件成为最后的包括这样的.cpp和.HPP文件:我该如何重新排列C头文件中的包含?

电流:

#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" 

谢谢!

回答

2

你去那里与发现和Perl:

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

E:忘了补充-0777(启用多行)

0

我没有制定出一个完整的脚本的时候,但这里的一个想法:

  1. 运行grep找到只包含#include "my.hpp"的文件,并只对这些文件运行下面的阶段
  2. 切问题包括线路使用类似sed 's/#include "my.hpp"'//
  3. 找到最后一个包括线路使用tacsed并向其追加的包括线路 - 详情请参见this question and accepted answer。我猜是这样

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

细节可能取决于你的具体文件,因此因人而异。

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是连续的,不是文件中的最后一个条目。