Perl one-liner来操作include目录

时间:2015-03-06 16:08:13

标签: regex perl

我有几百个包含需要更改的include指令的文件。

原型是#include "MyFile.hpp",但我需要在每个包含文件前面附加一个目录,如下所示:#include "project-head/MyFile.hpp"

我已编写了一行perl脚本,如下所示:

perl -p -i -e 's|/(#include /")/(.*/.hpp)|/1project-head/2|g' test_file.hpp

但是测试文件似乎没有改变。我的perl表达式出了什么问题?

1 个答案:

答案 0 :(得分:3)

Perl脚本中有多个奇数斜杠。 backrefs应为\1\2等,其余许多应完全删除。

perl -p -i -e 's|(#include ")(.*\.hpp)|\1project-head/\2|g' test_file.hpp

如果它不明显,/\是两个不同的字符,具有完全不同的语义。

替换命令的原型是s/from/to/,但您可以使用,并且在您的代码中使用不同的分隔符,因此它的s|from|to|根本没有斜线(唯一剩下的forward slash是project-head和原始文件名之间的目录分隔符。

反斜杠通常用作转义字符;例如,\.匹配一个文字句点(而未转义的.是一个正则表达式字符,它匹配除换行符之外的任何字符)。它在\1中具有特殊含义,可以引用与第一个带括号的子表达式匹配的文本(尽管在替换部分$1中是首选)。