perl使用一行程序搜索模式
我有一个像这样的文本文件perl使用一行程序搜索模式,perl,design-patterns,Perl,Design Patterns,我有一个像这样的文本文件 Hi how are you <blank> <blank> abcd <blank> defgh opqr <blank> Hi 你好吗 abcd 德夫 opqr 我想打印所有具有“某些文本”等图案的行空白“某些文本” 像 你好吗 abcd 我正在考虑使用join,然后搜索模式。但我不知道怎么做。(我所说的空白是指空行)也许我不理解这个问题。我想你要问的是,如何匹配具有相同文本(“某些文本”)的两个连续行并打印它们
Hi
how are you
<blank>
<blank>
abcd
<blank>
defgh
opqr
<blank>
Hi
你好吗
abcd
德夫
opqr
我想打印所有具有“某些文本”等图案的行空白“某些文本”
像
你好吗
abcd
我正在考虑使用join,然后搜索模式。但我不知道怎么做。(我所说的空白是指空行)也许我不理解这个问题。我想你要问的是,如何匹配具有相同文本(“某些文本”)的两个连续行并打印它们 要做到这一点,你可以这样做 假设文件以字符串形式存储在$file中
print "$1\n$1" while ($file =~ /(.*)(?=\n\1(?:\n|$))/mg);
*=匹配任何内容,尽可能多地抓取
()=捕获组、存储区。*在本例中为$1
(?=…)=向前看,以便字符串的该部分可以在下一次匹配中使用
\1=在第一个捕获组中捕获的内容(即$1)
(?:…)=非捕获组
/^(?:(!\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
应该如何处理
foo BLANK bar BLANK moo BLANK mar
呢?它应该打印整个内容,还是应该删除中间的两行空白?它应该打印整个内容好,这是我在回答中假设的:)添加了一个更简单但不太灵活的解决方案。[让尾随空格变得有意义是很恶心的!但它看起来更令人印象深刻:)]
perl -0777ne'print /^(?:.*\S.*\n(?:(?:(?!\n)\s)*\n){2})+.*\S.*\n/mg' file
perl -0777ne'print /^(?:.+\n\n\n)+.+\n/mg' file