regex - Perl 脚本与单行脚本 - 正则表达式的功能差异

标签 regex bash perl

我有一个 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/

相关文章:

linux - 无法将参数从 shell 脚本传递到 Perl 脚本

java - JFormattedTextField 使用正则表达式格式化程序?

javascript - 正则表达式匹配部分单词,前面没有任何内容,但允许有空格

linux - 检查软件是否安装在 SSH session 中

linux - Bash 脚本操作

perl - 如何在 Perl 和 Moose 中创建不可变对象(immutable对象)的循环图?

perl - 分块打印

perl - 在哪里可以找到 perl 共享对象目录?

regex - sed 在一个系统上工作但不在其他系统上工作

java正则表达式没有找到最长的匹配