Regex Perl多行正则表达式匹配和删除

Regex Perl多行正则表达式匹配和删除,regex,perl,Regex,Perl,我在perl脚本中处理一个文本文件。 如何删除仅包含*的两行或更多行。 输入: 我希望文本看起来像这样: some text * some text * some text * 你可以把整个文件都读进去 perl -0777pe's/^\*\n\K(\*\n)+//mg' (如果最后一行中缺少行终止符,则上述内容将无法正常工作。) 一行一行的工作也很简单,因为不需要向前看 perl -ne'print if !$flag || !/^\*$/; $flag = /^\*$/;' 使用“一个

我在perl脚本中处理一个文本文件。 如何删除仅包含
*
的两行或更多行。 输入:

我希望文本看起来像这样:

some text
*
some text
*
some text
*

你可以把整个文件都读进去

perl -0777pe's/^\*\n\K(\*\n)+//mg'
(如果最后一行中缺少行终止符,则上述内容将无法正常工作。)

一行一行的工作也很简单,因为不需要向前看

perl -ne'print if !$flag || !/^\*$/; $flag = /^\*$/;'

使用“一个衬里”的其他可能解决方案是

perl -0777 -pe "s/(\n\*)+/$1/g" regex_stars.txt
输入

输出

some text
*
some text
*
some text
*

你们们可以含糊其辞,或者无论如何把你们们的整个文件读入一个字符串(今天的计算机应该有足够的内存)并用一个字符串替换任何特殊的行序列

use English;
my $contents = do { local $/; <> };
chomp $contents;
$contents .= $RS;
$contents =~ s/^(\*$RS)+/\1/mg;
使用英语;
my$contents=do{local$/;};
chomp$目录;
$contents.=$RS;
$contents=~s/^(\*$RS)+/\1/mg;

“m”修饰符设置“^”锚点以识别任何行的开始,而不是整个字符串的开始。

Perfect。谢谢大家!
\1
是一种正则表达式模式(与第一次捕获匹配的内容相匹配)。在字符串文本中使用是没有意义的。您应该使用
$1
,并且Perl会发出警告,说明同样的情况。(您也可以使用稍快一点的
*\n
使用英语$RS…
是一种模糊的书写方式。
。\n…
使用作品;我个人更喜欢$RS,它是当前操作系统中的输入记录分隔符,最终适应了特定的需要。perlvar中美元的定义:。。。助记符:like\digits
$RS
在所有操作系统上都是
“\n”
。忘了提到在某些地方使用
$RS
,而在其他地方使用
$/
是相当奇怪的。相同的变量!对于
“abc\n*\n*def\n”
“*\n*\nxyz\n”
@ikegami,失败-原始帖子的格式与您引用的格式不同。未对OP进行任何编辑(发布后的前5分钟可能除外,但您在30分钟后回复)。不管怎样,这个答案都不能回答当前的问题。@ikegami-我在答案中再次添加了输入块和输出块,然后重新运行该命令。我看不出与OP的输入/输出有什么区别。你为什么用不相关的评论向我发送垃圾邮件?
some text
*
some text
*
some text
*
use English;
my $contents = do { local $/; <> };
chomp $contents;
$contents .= $RS;
$contents =~ s/^(\*$RS)+/\1/mg;