2015-07-27 2 views
-1

У меня есть текстовый файл с этими записямиRegex заменить первое вхождение только в Perl

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

Предполагая, что:
Первая линия также может быть «пустой строки»
Несколько «пустые строки» смежно не рассматривается как одна пустая строка. удаляется только первая пустая строка.

Как о чем-то вроде s/((\n)(\n)|(^\n)())/

и заменить 1-ю группу захвата ни с чем.

Я не уверен на 100% о синтаксисе perl, так как мои дни perl давно прошли.

+0

Оно не работает proerly .. – aqqq

+0

Я только что обновил это, я думаю, вам нужно заменить его на новую строку, а не «ничего», как я писал раньше. Я пытаюсь создать пример и разместить его здесь. –

+0

Извините, если предположить, что первая строка CAN - пустая строка, я не могу ее легко решить. В противном случае я могу предоставить несколько решений, которые работают. Я сделал все возможное. –

3

множество А $flag в Perl и проверить, если он установлен в 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 
+0

Великие умы думают одинаково, и по совпадению, так же как и наши. – mob

+0

@mob да действительно .. –

4

На риск предоставления «решения», а не «решение, использующее регулярное выражение», просто условие для пустой строки и флаг, который указывает, удалили ли вы пустую строку или нет.

Предполагая одну строку в каждом элементе @input,

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

исключит первую строку (и только первая строка), который не содержит непробельный характер. Вы можете предпочесть решение, подобное этому, потому что многострочные регулярные выражения требуют некоторой дополнительной осторожности, чтобы получить правильное решение.

0

Если пустая строка может быть линией с горизонтальными непечатаемых этот

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

Если пустая строка не может содержать горизонтальные пробельные этот

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

+0

Довольно простой на самом деле. – sln

+1

Почему бы вам не добавить модификатор '/ m' в конце подстановки, как и весь остальной мир? – Borodin

+0

@Borodin - его самодостаточный, в отличие от остального мира. – sln

0

Если у вас есть прочитайте весь свой файл в памяти, вы можете сделать это

s/^\h*\n//m 

/m (многоканальный) модификатор позволяет ^ соответствовать начало любой строки в файле.\h* соответствует нулю или более горизонтальных символов пробела, и \n соответствует новой строки в конце строки

Замещение найти первое вхождение шаблона и удалить его

Смежные вопросы