Regex 仅在perl中替换第一次出现的正则表达式

Regex 仅在perl中替换第一次出现的正则表达式,regex,perl,regex-greedy,Regex,Perl,Regex Greedy,我有一个包含这些条目的文本文件 data,34.45,5343 intaa,34353.5, 646463 dedaa, 22542.35, 3564643 eerreg, 3435,335353 rtgegr,343543,34332 我只想替换第一个空行,并忽略文件中存在的任何空行。我怎么能这样做 我在regex中读到了nongreedy,但找不到适合我需要的。有人能建议吗 我的最终数据应该是这样的 data,34.45,5343 intaa,34353.5, 646463 deda

我有一个包含这些条目的文本文件

data,34.45,5343

intaa,34353.5, 646463 
dedaa, 22542.35, 3564643
eerreg, 3435,335353

rtgegr,343543,34332
我只想替换第一个空行,并忽略文件中存在的任何空行。我怎么能这样做

我在regex中读到了nongreedy,但找不到适合我需要的。有人能建议吗

我的最终数据应该是这样的

data,34.45,5343
intaa,34353.5, 646463
dedaa, 22542.35, 3564643
eerreg, 3435, 335653

rtgegr,343543,34332
假设: 第一行也可以是空行 相邻的多个空行不会被视为一个空行。只删除第一个空行

像s/\n\n | ^\n这样的怎么样/

并将第一个捕获组替换为空

我不能100%确定perl语法,因为我的perl时代已经过去了。

在perl中设置$flag,并验证它是否在循环中设置:

perl -lne 'if((/^\s*$/ && !$flag)){$flag=1;next;}print' file
输出:


冒着提供解决方案而不是使用正则表达式的解决方案的风险,只需在空行上设置一个条件,并使用一个标志来指示是否删除了空行

假设@input的每个元素中有一行

将排除第一行,并且仅排除不包含非空白字符的第一行。您可能更喜欢这样的解决方案,因为多行正则表达式需要特别小心才能正确执行。

如果空行可以是带有水平空格的行,那么

$str=~s/?m^\h*\n/

如果空行不能包含水平空格,则此


$str=~s/?m^\n/

假设您已将所有文件读入内存,则可以执行此操作

s/^\h*\n//m
/m多行修改器允许^匹配文件中任何行的开头\h*匹配零个或多个水平空白字符,并且\n匹配行尾的换行符


替换将找到模式的第一个匹配项并将其删除

我刚刚更新了它,我认为您需要用换行符替换它,而不是像我以前写的那样。我正在尝试制作一个示例并发布在这里。对不起,假设第一行可以是空行,我无法轻松解决它。否则,我可以提供多种可行的解决方案。“不过我已经尽了最大的努力。”阿什温现在似乎在我的测试用例上起作用了。你可以检查一下,伟人的想法是一样的,巧合的是,我们的想法也是一样。真的很简单。你为什么不像世界其他地方一样,在替换的末尾加上/m修饰符呢?@Borodin-它是独立的,不同于世界其他地方。这种自我约束对任何人都有什么帮助?不幸的是,你的大多数读者不会理解你写的东西。我怀疑这与其说是自我克制的好处,不如说是表现和自命不凡offer@Borodin-好吧,它很容易从Perl定界符中删除并保存到Javas中,而不会丢失重要的关系?m^
@output = grep { /\S/ || !$flag++ } @input
s/^\h*\n//m