匹配多行并在perl正则表达式中打印它

时间:2015-04-24 09:24:14

标签: regex perl multiline

我希望匹配多行正则表达式并仅打印匹配的行:

$ cat test.txt
line1
line2
line3
$ perl -ne 'print if /line2.line3/s' test.txt
$

此正则表达式实际上与line2\nline3匹配,但不会打印。 regex101 verifies它匹配。

使用命令开关0777打印匹配的行,但它也打印不匹配的行:

$ perl -0777 -ne 'print if /line2.line3/s' test.txt
line1
line2
line3

在替换正则表达式中使用0777按预期工作:

$ perl -0777 -pe 's/line2.line3/replaced/s' test.txt
line1
replaced

我想了解是否可以只打印与多行正则表达式匹配的行?

3 个答案:

答案 0 :(得分:3)

没有参数的

print打印$_。如果您使用-0777,则整个文件将被读入$_,因此如果匹配,则打印整个文件。如果您只想显示匹配的部分,可以使用

 perl -0777 -ne 'print "$1\n" while /(line2.line3)/sg' test.txt

答案 1 :(得分:1)

我猜您不需要ifwhile或正则表达式群组。

 perl -0777 -ne 'print /line2\sline3\s/sg' test.txt

输出:

line2
line3

正则表达式解释:

line2\sline3\s
--------------

Match the character string “line2” literally (case insensitive) «line2»
Match a single character that is a “whitespace character” (any Unicode separator, tab, line feed, carriage return, vertical tab, form feed, next line) «\s»
Match the character string “line3” literally (case insensitive) «line3»
Match a single character that is a “whitespace character” (any Unicode separator, tab, line feed, carriage return, vertical tab, form feed, next line) «\s»

答案 2 :(得分:0)

考虑到行尾的另一个变体可能是:

perl -0777 -ne '($,, $\) = ("\n")x2; print /(^line2$)\s(^line3$)/msg'

比较:

$ cat test.txt 
line1
line2
line3
line1
line2 line3
$ perl -0777 -ne 'print /line2\sline3\s/sg' test.txt
line2
line3
line2 line3
$ perl -0777 -ne '($,, $\) = ("\n")x2; print /(^line2$)\s(^line3$)/gms' test.txt
line2
line3

m修饰符允许在多行上下文中使用^$g修饰符使字符串上的正则表达式循环。在这种情况下,不需要s修饰符,但有些人更喜欢始终拥有它。这些组使得正则表达式评估的列表每个匹配返回两个项目。最后,值列表分隔符($,)的打印用途和列表末尾($\)的值必须设置为"\n"

版本可以说更简单/更好,更接近上面的解决方案:

perl -0777 -ne 'print /line2\nline3\n/sg' test.txt