Perl一行代码搜索模式匹配

3

我有一个文本文件,格式类似下面这样:

Hi
how are you
<blank>
<blank>
abcd
<blank>
defgh
opqr
<blank>

我想打印所有含有“一些文本”空格空格“一些文本”模式的行,例如
how are you
<blank>
<blank>
abcd

我在考虑使用join方法并查找匹配模式,但不确定如何实现。(当我说空白时,指的是空行)


1
foo BLANK BLANK bar BLANK BLANK moo BLANK BLANK mar 应该如何处理? - ikegami
它应该打印整个内容,还是应该删除中间的两行空白行? - ikegami
它应该打印整个东西。 - Sara
好的,这正是我在我的回答中所假定的 :) - ikegami
2个回答

3
  • 空行:/^(?:(?!\n)\s)*\n/m
  • 非空行:/^.*\S.*\n/m

因此,您想要打印所有以下情况的实例:

 /
    ^
    (?:
       .*\S.*\n
       (?: (?:(?!\n)\s)*\n ){2}
    )+
    .*\S.*\n
 /mx

作为孤独的一线人员:
 perl -0777ne'print /^(?:.*\S.*\n(?:(?:(?!\n)\s)*\n){2})+.*\S.*\n/mg' file

如果你所有的空行都不含空格,你可以简化一些内容:
  • 空行:/^\n/m
  • 非空行:/^.+\n/m

 perl -0777ne'print /^(?:.+\n\n\n)+.+\n/mg' file

添加了一个更简单但不太灵活的解决方案。[使尾随空格有意义很糟糕!但它看起来更令人印象深刻:)] - ikegami

1
也许我没有理解问题。我认为你想问的是如何匹配两个连续的具有相同文本(“一些文本”)的行并打印它们。
要做到这一点,您可以像这样操作:
假设文件作为字符串存储在$file中。
print "$1\n$1" while ($file =~ /(.*)(?=\n\1(?:\n|$))/mg);

.* = 匹配任何字符,尽可能多地抓取

() = 捕获组,将 .* 存储到 $1 中

(?= ... ) = 向前查看,以便该字符串的那部分可以用于下一次匹配

\1 = 第一个捕获组中捕获的内容(即 $1)

(?: ... ) = 非捕获组


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接