我有几百个包含需要更改的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
表达式出了什么问题?
答案 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
中是首选)。