Удалить последний разрыв строки, используя sed

Как удалить последний \n из файла. В файле есть последняя пустая строка, созданная для разрыва строки в последней текстовой строке. Я использую эту команду:

sed '/^\s*$/d'

Но эта пустая строка не удаляется.

4 ответа

Почему sed печатать новую строку?

Когда вы читаете sed Стандарт POSIX, то он гласит:

Всякий раз, когда пространство шаблона записывается в стандартный вывод или именованный файл, sed должен немедленно следовать за ним с <newline>,

Немного больше деталей можно найти в этом ответе.

Удаление последнего <newline> :

  • truncate : Если вы хотите удалить только один символ из файла, вы можете сделать:

    truncate -s -1 <file>
    

    Это делает файл на один байт короче, т.е. удаляет последний символ.

    От man resize: -s, --size=SIZE установить или настроить размер файла с помощью SIZE байтов

    SIZE может также начинаться с префикса одним из следующих модифицирующих символов: ' + "продлить" - "уменьшить на" < ' в большинстве, ' > ' по крайней мере, ' / "округлить до нескольких" % 'округлить до нескольких.

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

1) УДАЛИТЬ ПОСЛЕДНЮЮ ПУСТОЙ ЛИНИИ ИЗ ФАЙЛА:

Прежде всего, команда, которую вы сейчас используете, удалит ВСЕ пустые и пустые строки!

НЕ ТОЛЬКО ПОСЛЕДНИЙ.

Если вы хотите удалить последнюю строку, если она пуста / пуста, вы можете использовать следующую команду:

sed '${/^[[:blank:]]*$/d}' test

ВХОД:

cat -vTE test                                                                                                                  
a$
$
b$
$
c$
^I ^I $

ВЫХОД:

sed '${/^[[:blank:]]*$/d}' test                                                                                                
a

b

c

Пояснения:

  • первый $ скажет sed выполнять обработку только в последней строке
  • /^[[:blank:]]*$/ условие будет оценено с помощью sed, и если эта строка пуста или состоит только из пустых символов, это вызовет операцию удаления в буфере шаблона, поэтому эта последняя строка не будет напечатана
  • вы можете перенаправить вывод команды sed, чтобы сохранить его в новый файл или внести изменения на месте, используя -i вариант (если вы используете его, сделайте резервную копию вашего файла!!!!) или используйте -i.bak заставить sed сделать резервную копию вашего файла перед его изменением.

ВАЖНЫЙ:

Если ваш файл поступил из Windows и содержит возврат каретки (\r) этот sed команда не сработает!!! Вам нужно будет удалить эти шумные символы, используя либо dos2unix или же tr -d '\r',

Для файлов, содержащих возврат каретки <CR> (\r или же ^M):

ПЕРЕД ИСПОЛЬЗОВАНИЕМ ФАЙЛА:

кошка:

cat -vTE test 
a$
$
b$
$
c$
^I ^I ^M$

расстояние:

od -c test 
0000000   a  \n  \n   b  \n  \n   c  \n  \t      \t      \r  \n
0000016

СЭД:

sed '${/^[[:blank:]]*$/d}' test                                                                                                
a

b

c

ПОСЛЕ ИСПРАВЛЕНИЯ ФАЙЛА:

dos2unix test 
dos2unix: converting file test to Unix format ...

кошка:

cat -vTE test                                                                                                                  
a$
$
b$
$
c$
^I ^I $

расстояние:

od -c test 
0000000   a  \n  \n   b  \n  \n   c  \n  \t      \t      \n
0000015

СЭД:

sed '${/^[[:blank:]]*$/d}' test                                                                                                
a

b

c

2) Удалите последний символ EOL из файла:

Для этой конкретной цели я бы рекомендовал использовать perl:

perl -pe 'chomp if eof' test
a

b

c

можете добавить -i вариант для изменения in-place (сделайте резервную копию вашего файла перед запуском команды). И последнее, но не менее важное: вам, возможно, придется удалить Carriage Return из ваших файлов, как описано ниже.

Вы также можете использовать ниже один вкладыш из sed удалить завершающие пустые строки:

sed -e :a -e '/^\n*$/N;/\n$/ba'

Ваш вопрос не ясен, но это может быть то, что вы просите:

$ cat file
a
b
c

$ awk 'NR>1{print p} {p=$0}' file
a
b
c
$
Другие вопросы по тегам