Удалить последнюю строку из файла

44

Я использую, sed чтобы быстро удалить строки с определенной позиции, как

sed '1d'
sed '5d'

Но что делать, если я хочу удалить последнюю строку файла, и я не знаю количество строк (я знаю, что могу получить это, используя wcи несколько других приемов).

В настоящее время используется обходной путь headи в tailсочетании с wcэтим. Какие-нибудь быстрые повороты здесь?

холодный морской тропический воздух
источник
Какой ОС? У некоторых ароматов есть интересные варианты headи tail...
Nils
@ Nils Я нахожусь на 'Red Hat Enterprise Linux Server версии 5.5 (Tikanga)'. Можете ли вы указать на варианты headи tailвы знаете о различных вкусах?
MTK
Я сделал. Увидеть ниже.
Нильс

Ответы:

88

в sed $последняя строка, поэтому удалить последнюю строку:

sed '$d' <file>
h3rrmiller
источник
12
Используйте sed -i '$d' <file>для редактирования файла на месте.
WanderingMind
1
Что было бы для удаления последних n строк, где n - любое целое число?
Джошуа Салазар
31

$ за последнюю строку:

sed '$d' file
Гуру
источник
10
побить тебя на 30 секунд: P
h3rrmiller
1
К сожалению, хотя нужно использовать более сложные методы, чтобы удалить, скажем, последние две строки.
dubiousjim
Что вы имеете в виду? sed '$d' file; sed '$d' file
Роб
3
@Rob: sed '$d' fileфактически не изменяет файл; он просто распечатывает содержимое файла, за исключением последней строки. Таким образом, sed '$d' file; sed '$d' fileбудет распечатывать содержимое файла дважды , минус последняя строка каждый раз. Эквивалент delete-the-last-two-line sed '$d' fileравен is sed '$d' file | sed '$d'.
Руах
2
Да, это не элегантно, но, конечно, это работает. Я бы сделал это за один проход с sed -n '1{h;n;}; $q; x; p;'. Я надулся, что мы не можем просто сделать sed '$-1,$d'.
dubiousjim
14

cat file.txt | head -n -1 > new_file.txt

Остерегайтесь, кажется, в зависимости от последней строки file.txt(если она заканчивается EOF, или \nи затем EOF), количество строк в new_file.txtможет быть таким же (как file.txt) после этой команды (это происходит, когда нет \n) - в любом случае, содержимое последней строки удаляется.

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

Эмануэль Берг
источник
6
Где это работает, это также может быть просто head -n -1 file.txt > new_file.txt. Обратите внимание, что отрицательный счет head -nдоступен только для некоторых реализаций head. Например, это не работает для FreeBSD или для версии BusyBox head.
dubiousjim
1
@dubiousjim: Согласен, head -n -1 file.txt > new_file.txtлучше. Он работает одинаково в отношении двух моих комментариев (одинаковое количество строк и стирание в одном и том же файле). Что касается отрицательного аргумента, такие различия время от времени возникают между Unix, и они часто разочаровывают, потому что вы ожидаете, что это будет одна и та же команда целиком (и почему бы вам не - то же имя и цель!) - во всяком случае, хорошо точка. (Я использую Debian.)
Эмануэль Берг
5

head --lines=-1, Сначала я наткнулся на эту возможность в man-странице для головы в SLES11SP2-системе (coreutils-8.12-6.23.1)

tailи headявляются частью coreutils-rpm (по крайней мере для систем на основе rpm).

Согласно журналу изменений coreutils, этот синтаксис поддерживается начиная с версии coreutils 5.0.1.

Плохая новость: в соответствии с man-страницей RH5 эта опция не описана

Хорошие новости: он работает с RH5 (так в вашем случае: он работает - по крайней мере, с текущей версией RH5).

rpm -q coreutils показывает мне (на CentOS 5.8): coreutils-5.97-34.el5_8.1

Я не уверен, что RH5.5. уже имеет версию coreutils, которая ее поддерживает. Но у 5.5 все равно есть EoLed.

Nils
источник
+1. это отлично работает на RH5.5. Спасибо.
MTK
0

Linux

$ - последняя строка, d для удаления:

sed '$d' ~/path/to/your/file/name

MacOS

Эквивалент Сед-я

sed -i '' -e '$ d' ~/path/to/your/file/name
jasonleonhard
источник