Новые строки в file1
делятся на четыре класса:
- символ новой строки, за которым следует еще один символ новой строки
- символ новой строки, которому предшествует символ новой строки
- перевод строки в конец файла
- сэндвич с новой строки
Удаление первого класса путем чтения всего ввода (опция -000
) и замены одной новой строки везде, где мы видим пару из них (s/\n\n/\n/g
), дает нам
$ perl -000 -pe 's/\n\n/\n/g' file1
The answer t
o your question
A conclusive a
nswer isn’t al
ways possible.
When in doubt, ask pe
ople to cite their so
urces, or to explain
Even if we don’t agre
e with you, or tell y
ou.
Это не то, что мы хотим, потому что первый класс новых строк должен завершать строки в file2
.
Мы можем попытаться быть умными и использовать отрицательный взгляд, чтобы удалить переводы строк, которым предшествуют другие переводы строк (второй класс), но вывод неотличим от предыдущего случая, что имеет смысл, потому что на этот раз мы удаляем последний а не первый в каждой паре новых строк.
$ perl -000 -pe 's/(?<=\n)\n//g' file1
The answer t
o your question
A conclusive a
nswer isn’t al
ways possible.
When in doubt, ask pe
ople to cite their so
urces, or to explain
Even if we don’t agre
e with you, or tell y
ou.
Несмотря на это, это все еще не то, что мы хотим, потому что переводы строки , перед которыми другие символы перевода строки становятся пустыми строками в file2
.
Очевидно, что мы хотим продолжить перевод строки в конце file1
.
В таком случае нам нужна программа, которая удаляет только четвертый класс: каждая новая строка, которой не предшествует другая новая строка и за которой не следует ни другая новая строка, ни логический конец ввода.
Используя проверочные утверждения Perl , спецификация проста, хотя, возможно, немного пугающая по внешнему виду. «Не предшествует перевод строки» - это негативный след (?<!\n)
. Используя отрицательный прогноз (?!...)
, мы не хотим видеть еще одну новую строку или (|
) конец ввода ($
).
Собрав все вместе, мы получим
$ perl -000 -pe 's/(?<!\n)\n(?!\n|$)//g' file1
The answer to your question
A conclusive answer isn’t always possible.
When in doubt, ask people to cite their sources, or to explain
Even if we don’t agree with you, or tell you.
Наконец, чтобы создать file2
, перенаправьте стандартный вывод.
perl -000 -pe 's/(?<!\n)\n(?!\n|$)//g' file1 >file2