为什么我必须将perl输出传送到新的perl命令中

时间:2019-03-26 22:34:33

标签: bash perl recursion pipe string-substitution

我想在执行许多其他正则表达式替换的perl脚本中删除反引号(\ x60)和单词字符之间的空格。如果我将早期替换的结果打印到bash shell中,然后通过管道传输到新的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调用中它不起作用?我以为我们应该避免使用多个或嵌套的管道(子壳)。

这是BSD Unix中的perl 5,版本18和GNU bash,版本3.2.57(1)。

1 个答案:

答案 0 :(得分:2)

由于您的perl -p在换行符上进行拆分,因此您的第一个perl会将其删除,而第二个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可以删除新行,第二个{\ 1}}可以删除引用后的空格。