2015-03-06 4 views
0

У меня есть несколько сотен файлов с директивами include, которые необходимо изменить.Perl one-liner для управления include include

Прототип #include "MyFile.hpp", но мне нужно добавить каталог перед каждым включенным файлом следующим образом: #include "project-head/MyFile.hpp". кажется, не тестовый файл

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

Но меняется:

Я написал скрипт на языке Perl однострочный следующим образом. Что не так с моим выражением perl?

+1

Вы собираетесь использовать косые черты? Похоже, что некоторые должны быть исключены, а другие должны быть обратными косыми чертами. – bloodyKnuckles

ответ

3

У вас есть несколько нечетных косых черт в вашем скрипте Perl. Брекеты должны быть \1, \2 и т. Д., И многие из остальных должны быть полностью удалены.

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

В случае, если это не стало очевидным, / и \ два разных персонажа с радикально различной семантикой.

Прототип для команды подстановки является s/from/to/, но вы можете использовать и иметь в своем коде, используемом, различные разделители, так что s|from|to|, без косой черты на всех (единственный оставшийся вперед слэш каталог разделитель между project-head и оригиналом имя файла).

Обратная косая черта обычно используется как символ эвакуации; например, \. соответствует литеральному периоду (тогда как неопределенный . является метасимволом регулярного выражения, который соответствует любому символу, кроме новой строки). Он также имеет особое значение в \1 для возврата к тексту, согласованному с первым подвыражением в скобках (хотя в замещающей части $1 является предпочтительным).

+0

Намного лучше объяснил, чем я; Я удалил свой ответ. – halfflat

+0

Спасибо за отличный ответ. Я соглашусь на это через 43 секунды. –