2016-07-28 7 views
-1

Я пытаюсь сделать заменить следующие PERL команды:

perl -C -p -i -e 's/([\?\.\!])\n/$1 /g' html/數14.html 

Результат хорошо, когда я называю его из командной строки. Когда я вызываю его из Makefile, он не работает. По-видимому, $ 1 интерпретируется как переменная оболочки.

В Makefile выглядит следующим образом:

數14.html: 數14.adoc 40_2064_Im\ Strand-Appartment.adoc 41_2064_Ein\ Plan.adoc 42_1915_In\ einer\ Suppenküche.adoc 
    asciidoctor -D html parts/數14.adoc 
    perl -C -p -i -e 's/([\?\.\!])\n/$1 /g' html/數14.html 

Как я могу иметь нормальное регулярное выражение поведение здесь?

+2

Просьба показать, как вы вызываете его в своем сценарии bash. Он не будет переменной оболочки, если он одинарный, как в вашем примере выше; но это будет, если вы поместите несколько разных котировок вокруг него. Например, 'foo = $ (perl -C -p -i -e 's/([\? \. \!]) \ N/$ 1/g' html/數 14.html)' цитируется '$() ', который расширит' $ 1', и вам нужно будет сбежать '$ 1' в' \ $ 1'. – Amadan

+0

Читать эту тему: [http://stackoverflow.com/questions/31557677/how-to-pass-a-regular-expression-as-a-parameter-to-a-perl-one-liner-in-a- bash-sc/31563152 # 31563152] – Poyke

+1

Да, извините. Это не скрипт bash, это Makefile. : - | – Michael

ответ

2

Makefile всегда интерпретирует $ последовательности перед выполнением команд без учета цитирования. Чтобы избежать $ в Makefile, напишите его как $$ - это приведет к команде $.

Смежные вопросы