我希望匹配多行正则表达式并仅打印匹配的行:
$ 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
我想了解是否可以只打印与多行正则表达式匹配的行?
答案 0 :(得分:3)
print
打印$_
。如果您使用-0777
,则整个文件将被读入$_
,因此如果匹配,则打印整个文件。如果您只想显示匹配的部分,可以使用
perl -0777 -ne 'print "$1\n" while /(line2.line3)/sg' test.txt
答案 1 :(得分:1)
我猜您不需要if
,while
或正则表达式群组。
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