почему я должен передать вывод perl в новую команду perl - PullRequest
1 голос
/ 27 марта 2019

Я хочу удалить пробел между обратным тиком (\ x60) и символами слова внутри скрипта perl, который выполняет множество других подстановок регулярных выражений. Если я распечатаю результаты предыдущих замен в оболочке bash, а затем передам новый вызов perl, это сработает. Но внутри одного вызова Perl это не так. В приведенном ниже примере третья строка (одна команда perl) не работает, тогда как четвертая строка (две отдельные команды) работает.

printf '%b' 'Well, `\n he said it \n' 
printf '%b' 'Well, `\n he said it \n' | perl -p -e 'use strict; use warnings; s|\n||g;' ; echo
printf '%b' 'Well, `\n he said it \n' | perl -p -e 'use strict; use warnings; s|\n||g; s|([\x60])\s*(\w)|$1$2|g;' ; echo
printf '%b' 'Well, `\n he said it \n' | perl -p -e 'use strict; use warnings; s|\n||g;' | perl -p -e 'use strict; use warnings; s|([\x60])\s*(\w)|$1$2|g;'; echo

Почему он не работает внутри одного вызова perl? Я думал, что мы должны избегать нескольких или вложенных труб (подоболочек).

Это perl 5, версия 18 и GNU bash, версия 3.2.57 (1) в BSD unix.

1 Ответ

2 голосов
/ 27 марта 2019

Поскольку ваш perl -p разделяется на новые строки, ваш первый perl удаляет их, а второй видит все так, как если бы он был в одной строке.

printf '%b' 'Well, `\n he said it \n' | perl -p0 -e 'use strict; use warnings; s|\n||g; s|([\x60])\s*(\w)|$1$2|g;' ; echo

Говоря Perl, чтобы он все время хлестал, первая s может удалить новые строки, а вторая удалит пробелы после вашей цитаты.

...