正则表达式只在perl中替换第一次出现

时间:2015-07-27 20:03:05

标签: regex perl regex-greedy

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

data,34.45,5343

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

rtgegr,343543,34332

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

我在正则表达式中读到了关于nongreedy的内容,但找不到与我的需求相匹配的内容。有人可以建议吗?

我的最终数据应如下所示

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

rtgegr,343543,34332

5 个答案:

答案 0 :(得分:4)

冒着提供解决方案的风险"而不是使用正则表达式"的解决方案,只是在一个空行和一个标志上说明你是否删除了空行。

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

@output = grep { /\S/ || !$flag++ } @input

将排除不包含非空白字符的第一行(仅第一行)。您可能更喜欢这样的解决方案,因为多行正则表达式需要额外注意才能获得正确的结果。

答案 1 :(得分:3)

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

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

<强>输出:

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

rtgegr,343543,34332

答案 2 :(得分:0)

假设:
第一行也可以是&#34;空行&#34;
多个&#34;空行&#34;相邻不被视为一条空行。只删除了第一个空行。

s/((\n)(\n)|(^\n)())/

之类的内容

并替换第一个捕获组。

我对perl语法不是100%肯定,因为我的perl日子早已不复存在。

答案 3 :(得分:0)

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

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

如果空行不能包含水平空格,那么

$str =~ s/(?m)^\n//;

答案 4 :(得分:0)

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

for

int i; for (i = 1; i < ar.length; i++) { // ... } System.out.println(i); (多行)修饰符允许s/^\h*\n//m 匹配文件中任何行的开头。 /m匹配零个或多个水平空白字符,^匹配行尾的换行符

替换将找到第一次出现的模式并将其删除