Как удалить стартовые символы новой строки или стартовые строки из двоичного файла? - PullRequest
0 голосов
/ 18 января 2020

Я вижу, что есть дискуссии об удалении завершающих символов новой строки.

Как я могу удалить новую строку, если это последний символ в файле?

Но я не не найти обсуждения об удалении начальных строк. Кто-нибудь может дать мне знать, каков наилучший способ удалить начальные переводы строк (предпочтительнее один вкладыш)? Спасибо.

Ответы [ 5 ]

2 голосов
/ 18 января 2020

Эквивалентный 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 ...
1 голос
/ 18 января 2020

В Python начинайте чтение файла без записи в al oop, пока не получите непустую строку.

outdata = ""
with open(filename) as infile:
    while True:
        line = infile.readline()
        if line != "\n":
            break
    if line:
        outdata = line # save first non-empty line
    outdata += infile.read() # save the rest of the file
with open(filename, "w") as outfile:
    outfile.write(outdata)
0 голосов
/ 18 января 2020

Установите флаг, когда вы найдете строку, которая не является только новой строкой, и напечатайте, когда этот флаг установлен:

awk '/./{f=1}f' file

например:

$ printf '\n\n\nfoo\nbar\n'



foo
bar

$ printf '\n\n\nfoo\nbar\n' | awk '/./{f=1}f'
foo
bar
0 голосов
/ 18 января 2020

Это то, что я придумал, я уверен, что его можно еще немного улучшить.

with open('../resources/temp_in.txt', 'r+') as file:
    overwrite = False
    for line in file:
        if line:
            overwrite = True
            first_line = line
            break
    if overwrite:
        contents = first_line + file.read()
        file.seek(0)
        file.write(contents)
        file.truncate()

Вот альтернативное решение, которое открывает файл дважды.

with open('../resources/temp_in.txt') as file:
    for line in file:
        if line.strip():
            contents = line + file.read()
            break
    else:
        contents = ''

with open('../resources/temp_in.txt', 'w') as file:
    file.write(contents)
0 голосов
/ 18 января 2020

Простой фильтр для пропуска начальных пустых строк

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

my $begin = 1;

while( <> ) {
        next if /^$/ and $begin;
        $begin = 0;
        say;
}

Версия с одним вкладышем perl -0777 -pe 's/^\n+//' filename

...