我有一个 Perl 程序,它采用 STDIN(从另一个 bash 命令通过管道传输)。 bash 命令的输出相当大,大约有 200 行。我想获取整个输入(多行)并将其提供给单行 Perl 脚本,但到目前为止我尝试过的任何方法都不起作用。相反,如果我使用以下 perl(.pl 文件):
#!/usr/bin/perl
use strict;
my $regex = qr/{(?:\n|.)*}(?:\n)/p;
if ( <> =~ /$regex/g ) {
print "${^MATCH}\n";
}
并像这样执行我的 bash 命令:
<bash command> | perl -0777 try_m_1.pl
它有效。但作为单行代码,它不能与相同的正则表达式/bash 命令一起使用。 print
命令的结果是什么。我试过这样:
<bash command> | perl -0777 -e '/{(?:\n|.)*}(?:\n)/pg && print "$^MATCH";'
还有这个:
<bash command> | perl -0777 -e '/{(?:\n|.)*}(?:\n)/g; print "$1\n";'
还有很多其他的事情,太多了,无法一一列举。我是 Perl 新手,只想用它从文本中获取正则表达式输出。如果有比 perl 更好的东西来做到这一点(我从阅读周围了解到 sed 不适用于此?)请随时提出建议。
更新:根据@zdim的回答,我尝试了以下方法,效果很好:
<bash command> | perl -0777 -ne '/(\{(?:\n|.)*\}(?:\n))/s and print "$1\n"'
我猜我的正则表达式需要包裹在 ()
中,并且 {
花括号需要转义。
最佳答案
单行代码需要 -n
(或 -p
)来处理输入,以便打开文件、附加流并设置循环。即使 -0777
仍然需要它取消设置input record separator ,因此文件被立即读取;请参阅Why use the -p|-n in slurp mode in perl one liner?
该正则表达式匹配换行符或除换行符之外的任何字符,并且有一个修饰符 /s
,其中 .
也匹配换行符。然后需要将其放在大括号内,您需要在较新的 Perls 中对其进行转义。后面的换行符不需要分组。
所以你总共会拥有
<bash command> | perl -0777 -ne'/(\{(.*)\}\n)/s and print "$1\n"'
关于regex - Perl 脚本与单行脚本 - 正则表达式的功能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56486772/