Как я могу написать Perl-однострочник для Makefile, чтобы я мог перевести литерал \ n в новую строку? - PullRequest
4 голосов
/ 13 мая 2010

Мне нужно экранировать \ n, поэтому при выводе я получаю символ новой строки или табуляцию

$ perl -p -e 's/e/a/ge'

теперь я хочу, чтобы каждый e был заменен на \ n

$ perl -p -e 's/e/\n/ge'

но даже \ n выдает ошибку.

это был упрощенный пример. В реальном скрипте (makefile) у меня есть

substitute := perl -p -e 's/@([^@]+)@/defined $$ENV{$$1} ? $$ENV{$$1} : $$1/ge'

и в target у меня есть такая хорошая команда

$(substitute) $< > $@

и если входной файл для perl содержит \n на выходе, я увижу его буквально ... Я хочу получить реальный перевод строки.

Ответы [ 4 ]

4 голосов
/ 13 мая 2010

Удалите модификатор e, и замена будет работать нормально:

perl -p -e 's/e/\n/g' file

С perldoc perlop :

e   Evaluate the right side as an expression.

UPD: если вы хотите сохранить его, поместите escape-последовательность в двойные кавычки:

perl -p -e 's/e/"\n"/ge' file
3 голосов
/ 13 мая 2010

Чтобы интерполировать вещи, которые сами нуждаются в интерполяции (например, переменные или экранирование), используйте двойное e и добавьте кавычки:

perl -p -e 's/@([^@]+)@/q!"! . ( defined $ENV{$1} ? $ENV{$1} : $1 ) . q!"!/gee'

Это не сработает, если сама подстановка содержит "неэкранированный" или $ или @; в этом случае вам придется отдельно обрабатывать обратную косую черту.

3 голосов
/ 13 мая 2010

Вам не нужно e в вашем регулярном выражении:

dpavlin@llin:~/private/home_html$ perl -p -e 's/e/\n/g'
foedoe
fo
do
0 голосов
/ 13 мая 2010
echo xeieio | perl -pe 's/(.)/$k=$1;$k=~s#e#\n#;$k/ge'

выходы:

х
я
io

Что он делает ... для каждого символа присвойте его $ k, запустите простой s / e / \ n / для $ k, затем напечатайте $ k (Также, как всегда, есть несколько способов сделать это)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...