Удалить пустые строки с концов группы файлов - PullRequest
1 голос
/ 23 июня 2019

У меня есть куча файлов, в которых много строк, и обычно одна или две пустые строки в конце.

Я хочу удалить пустые строки в конце, сохраняя при этом все пустые строки, которые могут существовать в файле.

Я хочу ограничить операцию использованием утилит GNU или аналогичных, т. Е. Bash, sed, awk, cut, grep и т. Д.

Я знаю, что могу легко удалить все пустых строк, например:

sed '/^$/d'

Но я хочу оставить пустые строки, которые существуют до дальнейшего содержимого в файле.

Ввод файла может быть следующим:

line1
line2

line4
line5


Я бы хотел, чтобы результат выглядел следующим образом:

line1
line2

line4
line5

Все файлы <100 КБ, и мы можем делать временные копии. </p>

Ответы [ 4 ]

3 голосов
/ 23 июня 2019

С Perl:

perl -0777 -pe 's/\n*$//; s/$/\n/' file

Вторая команда S (s/$/\n/) снова добавляет новую строку в конец вашего файла для совместимости с POSIX.

Или короче:

perl -0777 -pe 's/\n*$/\n/' file

С комментарием Фелы Маслен для редактирования файлов на месте (-i) и перемещения всех элементов в текущем каталоге (*):

perl -0777 -pe 's/\n*$/\n/' -i *
2 голосов
/ 23 июня 2019

Если строки, содержащие только пробелы, следует считать пустыми:

$ tac file | awk 'NF{f=1}f' | tac
line1
line2

line4
line5

в противном случае:

$ tac file | awk '/./{f=1}f' | tac
line1
line2

line4
line5
2 голосов
/ 23 июня 2019

Вот решение awk (Стандартный linux gawk). Мне понравилось писать.

одна строка:

awk '/^\s*$/{s=s $0 ORS; next}{print s $0; s=""}' input.txt

с использованием читаемого сценария script.awk

    /^\s*$/{skippedLines = skippedLines $0 ORS; next}
    {print skippedLines $0; skippedLines= ""}

Объяснение:

/^\s*$/ {                   # for each empty line
    skippedLines = skippedLines $0 ORS; # pad string of newlines
    next;                   # skip to next input line
}
{                           # for each non empty line
    print skippedLines $0;  # print any skippedLines and current input line
    skippedLines= "";       # reset skippedLines
}
1 голос
/ 24 июня 2019

Это может сработать для вас (GNU sed):

sed ':a;/\S/{n;ba};$d;N;ba' file

Если текущая строка содержит непробельный символ, выведите пробел текущего шаблона, извлеките следующую строку и повторите. Если текущая строка (и) пуста и является последней строкой в ​​файле, удалите пробел, в противном случае добавьте следующую строку и повторите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...