Я использую, sed
чтобы быстро удалить строки с определенной позиции, как
sed '1d'
sed '5d'
Но что делать, если я хочу удалить последнюю строку файла, и я не знаю количество строк (я знаю, что могу получить это, используя wc
и несколько других приемов).
В настоящее время используется обходной путь head
и в tail
сочетании с wc
этим. Какие-нибудь быстрые повороты здесь?
text-processing
sed
холодный морской тропический воздух
источник
источник
head
иtail
...head
иtail
вы знаете о различных вкусах?Ответы:
в sed
$
последняя строка, поэтому удалить последнюю строку:источник
sed -i '$d' <file>
для редактирования файла на месте.$ за последнюю строку:
источник
sed '$d' file; sed '$d' file
sed '$d' file
фактически не изменяет файл; он просто распечатывает содержимое файла, за исключением последней строки. Таким образом,sed '$d' file; sed '$d' file
будет распечатывать содержимое файла дважды , минус последняя строка каждый раз. Эквивалент delete-the-last-two-linesed '$d' file
равен issed '$d' file | sed '$d'
.sed -n '1{h;n;}; $q; x; p;'
. Я надулся, что мы не можем просто сделатьsed '$-1,$d'
.cat file.txt | head -n -1 > new_file.txt
Остерегайтесь, кажется, в зависимости от последней строки
file.txt
(если она заканчиваетсяEOF
, или\n
и затемEOF
), количество строк вnew_file.txt
может быть таким же (какfile.txt
) после этой команды (это происходит, когда нет\n
) - в любом случае, содержимое последней строки удаляется.Также обратите внимание, что вы должны использовать второй (промежуточный) файл. Если вы переадресовали и перенаправили на тот же файл, вы удалите его.
источник
head -n -1 file.txt > new_file.txt
. Обратите внимание, что отрицательный счетhead -n
доступен только для некоторых реализацийhead
. Например, это не работает для FreeBSD или для версии BusyBoxhead
.head -n -1 file.txt > new_file.txt
лучше. Он работает одинаково в отношении двух моих комментариев (одинаковое количество строк и стирание в одном и том же файле). Что касается отрицательного аргумента, такие различия время от времени возникают между Unix, и они часто разочаровывают, потому что вы ожидаете, что это будет одна и та же команда целиком (и почему бы вам не - то же имя и цель!) - во всяком случае, хорошо точка. (Я использую Debian.)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.
источник
Linux
$ - последняя строка, d для удаления:
MacOS
Эквивалент Сед-я
источник