我想在执行许多其他正则表达式替换的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)。
答案 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}}可以删除引用后的空格。