Эквивалентный Perl код, эквивалентный chomp
, равен s/^\n//
. Вместо того, чтобы делать это в последней строке (eof), делайте это в первой строке. Даже если это будет только пустая строка, удаление новой строки будет означать, что строка не будет ничего печатать в выходных данных.
perl -pe 's/^\n// if $. == 1' filename >filename2
или на месте:
perl -pi -e 's/^\n// if $. == 1' filename
Поскольку начинающиеся новые строки по определению пустые строки, вы также можете просто пропустить их печать, используя -n
вместо -p
(то же самое поведение, но без печати, так что вы можете определить, какие строки печатать).
perl -ni -e 'print unless $. == 1 and m/^\n/' filename
Если вы если вы хотите удалить несколько начальных символов новой строки, вы можете использовать другой подход; продвигайте ручку самостоятельно в начале, пока не получите непустую строку.
perl -pi -e 'if ($. == 1) { $_ = <> while m/^\n/ }' filename
Все гораздо проще, если вы не возражаете против чтения всего файла в память сразу, а не построчно:
perl -0777 -pi -e 's/^\n+//' filename
Чтобы избежать излишней работы по редактированию файла, если только он не начинается с символов новой строки, вы можете обусловить редактирование, добавив к нему префикс другой командой (читает первую строку файла и вызывает ненулевой статус выхода если не начинается с новой строки):
perl -e 'exit 1 unless <> =~ m/^\n/' filename && perl ...