Удалить последний разрыв строки, используя 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
$