Вы выполняете следующую программу:
LINE: while (<>) {
s/\n+/\n/g;
}
continue {
die "-p destination: $!\n" unless print $_;
}
Поскольку вы читаете по одной строке за раз, и поскольку строка - это последовательность символов, которые не являются переводами строки, оканчивающимися переводом строки,ваш шаблон никогда не будет соответствовать более чем одной новой строке.
Простое исправление состоит в том, чтобы заставить Perl рассматривать весь файл как одну строку.Кроме того, вы не хотите заменять каждый перевод строки, а только те, которые находятся в последовательности двух или более, и вы хотите заменить последовательность двумя переводами строки.
perl -0777pe's/\n\n\K\n+//g; s^\n+//; s/\n\K\n\z//' some_random_text.txt
Вторая и третья заменыубедитесь, что в начале и в конце файла нет пустых строк.
Хотя чтение всего файла в память легко, это не обязательно.Желаемый результат также может быть достигнут путем сохранения флага, который указывает, была ли предыдущая строка пустой или нет.
perl -ne'if (/\S/) { print "\n" if $f; print; $f=0 } else { $f=1 }' some_random_text.txt
Это решение также удаляет пустые строки из начала и конца файла.