2013-03-23 4 views
-2

У меня есть огромный файл, где большинство строк давно, но есть несколько строк, которые всего несколько слов:Как конкатенировать линии, соответствующие шаблону?

 
Here is a long sentence. 
This 
is 
a 
short 
line. 
Here is a long sentence. 
Here is a long sentence. 
This 
is 
another 
short 
line. 
Here is a long sentence. 

Все короткие строки начинаются с уникальными словами. В этом примере короткие строки начинаются с «This» и заканчиваются на «line». И они охватывают ровно столько же строк. Мне нужна команда, которая будет конкатенировать только короткие строки в файле, так что я получаю

 
Here is a long sentence. 
This is a short line. 
Here is a long sentence. 
Here is a long sentence. 
This is another short line. 
Here is a long sentence. 

Есть ли команда, которая будет делать эту работу? Я не хочу писать программу сценария, если мне не нужно ...

Спасибо.

+0

Может "длинные" линии определенно не начинаются с "это"? –

+1

Когда вы говорите «Все короткие строки начинаются с уникальных слов». Вместо этого вы подразумеваете «Все короткие строки начинаются с одного слова»? Вам нужно разместить более представительный ввод и ожидаемый результат. –

+0

Пожалуйста, попробуйте этот модуль [разделить английские предложения] (http://search.cpan.org/~shlomoy/Lingua-EN-Sentence-0.25/lib/Lingua/EN/Sentence.pm) –

ответ

4
perl -pe's/\n//if ($j ||= /^This$/) &&= !/^line\.$/' 

Использование:

perl -pe'...' file.in >file.out # From file 
perl -pe'...' <file.in >file.out # From STDIN 
perl -i~ -pe'...' file    # "In-place" with backup 
perl -i -pe'...' file    # "In-place" without backup 
+0

+1 для использования. Спасибо! – gaussblurinc

+0

Зачем использовать 'This' и 'line', если все предложения заканчиваются на период? Не могли бы вы просто заменить все CR/LF на одно место, а затем заменить '\.' с '\. \ n'? Это предполагает, что мы хотим получить одно предложение за строку. –

+1

@ Jim Black, потому что я решил следовать спецификациям вместо того, чтобы делать необоснованные предположения. – ikegami

0
sed -e :a -e '/line\.$/{p;d;}' -e '/^This/{N;s/\n/ /g;};ta' file.in > file.out 
Смежные вопросы