Скрытая строка в файле?

У меня есть файл UTF-8/no BOM (преобразованный из ISO-8859-1), содержащий 31214 строк. Я уже запускал dos2unix в файле. Когда я открываю его в блокноте ++, я вижу пустую строку внизу. Когда я удаляю эту пустую строку, количество строк уменьшается на единицу. Я сохраняю его под другим именем, и когда я заканчиваю файл, подсказка отображается в той же строке. Из bash, как мне удалить пустую строку в 1-м файле, чтобы получить результат, отображаемый ниже во 2-м файле?

Цель состоит в том, чтобы сделать это из bash без ручного удаления строки в блокноте ++

1-й файл:

[user@server]$ cat file1.txt | wc -l
31214
[user@server]$ tail file1.txt
T       31212           Data     20170517
[user@server]$

2-й файл (отредактированный с помощью notepad++)

[user@server]$ cat file2.txt | wc -l
31213
[user@server]$ tail file2.txt
T       31212           Data     20170517[user@server]$ 

person Goiko74    schedule 17.05.2017    source источник


Ответы (3)


Это конечная новая строка последней строки. Некоторые редакторы позволяют перейти на несуществующую «пустую» строку в конце, некоторые не показывают ее. Опять же, некоторые программы могут позволить вам удалить последнюю новую строку, но обратите внимание, что, например. Фактически POSIX требует его наличия, а некоторые стандартные утилиты ведут себя странно, если его нет.

Например. wc -l подсчитывает количество новых строк во входном файле (printf "foo\nbar" | wc -l показывает 1), поэтому удаление последней новой строки уменьшает количество строк.

Кроме того, Bash печатает подсказку везде, где был оставлен курсор на экране, поэтому, если вы напечатаете что-то, что не имеет завершающей новой строки, подсказка будет размещена там, где заканчивалась последняя неполная строка, как вы видели.

Нет необходимости удалять этот последний перевод строки, просто оставьте его там.

person ilkkachu    schedule 17.05.2017
comment
На самом деле, программа, которая читает текстовые файлы, дергается, потому что в конце есть новая строка. Я читал, что использование truncate -s -1 <file> даст нужный мне результат. Я дам вам знать, если это сработает. Спасибо, что рассказали мне о новых строках - person Goiko74; 18.05.2017
comment
удаление новой строки в конце файла решило мою проблему - person Goiko74; 24.05.2017

Чтобы удалить последний символ новой строки, можно, как описано здесь, использовать

sed -i '$ s/.$//' your.file

который ничем не заменит последний символ в последней строке файла (если вы хотите удалить что-то еще из конца файла, вы можете заменить регулярное выражение .$ на smth-else$). -i означает «заменить на месте» (в FreeBSD/MacOS вам нужно добавить пустую строку в качестве аргумента: sed -i "" '$ s/.$//' your.file)

person macleginn    schedule 17.05.2017

В file2.txt отсутствует завершающий символ новой строки.
Да, текстовый файл должен заканчиваться символом новой строки.

Учитывая, что вы знаете, что в конце отсутствует символ новой строки, этой команды должно быть достаточно, чтобы исправить проблему:

$ echo >> file2.txt
person ImHere    schedule 17.05.2017