我有一个包含这些条目的文本文件
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
答案 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
匹配零个或多个水平空白字符,^
匹配行尾的换行符
替换将找到第一次出现的模式并将其删除