Видаліть останній рядок із файлу


44

Я використовую sed для швидкого видалення рядків з певним положенням як

sed '1d'
sed '5d'

Але що робити, якщо я хочу видалити останній рядок файлу, і я не знаю кількість рядків (я знаю, що можу отримати це за допомогою wcта кількох інших хитрощів).

В даний час, використовуючи вирішення headта tailпоєднуючи це wcдля цього. Тут якісь швидкі повороти?


Який ос? Деякі аромати мають цікаві варіанти headта tail...
Nils

@Nils Я на "Red Hat Enterprise Linux Server release 5.5" (Tikanga) ". Чи можете ви вказати на варіанти headта tailвам відомо про різні смаки?
mtk

Я робив. Дивись нижче.
Нілс

Відповіді:


88

у sed $- останній рядок, тому видалити останній рядок:

sed '$d' <file>

12
Використовуйте sed -i '$d' <file>для редагування файлу на місці.
WanderingMind

1
Що було б для видалення останніх n рядків, де n - будь-яке ціле число?
Джошуа Салазар

31

$ за останній рядок:

sed '$d' file

10
побили вас за 30 секунд: P
h3rrmiller

1
На жаль, хоча для видалення, скажімо, останніх двох рядків потрібно використовувати більш складні методи.
сумнівним

Що ви маєте на увазі? sed '$d' file; sed '$d' file
Роб

3
@Rob: sed '$d' fileфактично не змінює файл; він просто виводить вміст файлу за вирахуванням останнього рядка. Так sed '$d' file; sed '$d' fileбуде роздрукувати вміст файлу в два рази , за вирахуванням останнього рядка кожен раз. Еквівалент видалення-останнього-двох рядків sed '$d' fileє sed '$d' file | sed '$d'.
ruakh

2
Так, це не елегантно, але, звичайно, це працює. Я би зробив це за один прохід з sed -n '1{h;n;}; $q; x; p;'. Я мотав, що ми не можемо просто зробити це sed '$-1,$d'.
сумнівним

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.
сумнівним

1
@dubiousjim: Погодився, head -n -1 file.txt > new_file.txtкраще. Це працює так само, як і для моїх двох коментарів (однакова кількість рядків, і, стерти в одному файлі). Щодо негативного аргументу, то такі розбіжності час від часу трапляються між Unixes, і вони часто засмучують, оскільки ви очікуєте, що це повністю та сама команда (а чому б ви не - те саме ім’я та ціль!) - так чи інакше, добре бал. (Я використовую Debian.)
Емануель Берг

5

head --lines=-1. Я вперше натрапив на таку можливість на ман-сторінці для голову про систему SLES11SP2 (coreutils-8.12-6.23.1)

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

Відповідно до журналу змін coreutils, цей синтаксис підтримується, оскільки coreutils-версія 5.0.1

Погані новини: За даними сторінки RH5, цей параметр не описаний

Хороша новина: вона працює з RH5 (так у вашому випадку: вона працює - принаймні з поточною версією RH5).

rpm -q coreutils показує мені (на CentOS 5.8): coreutils-5.97-34.el5_8.1

Я не впевнений, чи RH5.5. вже є версія coreutils, яка його підтримує. Але 5,5 все-таки EoLed.


+1. він ідеально працює на RH5.5. Спасибі.
mtk

0

Linux

$ - останній рядок, d для видалення:

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

MacOS

Еквівалент sed -i

sed -i '' -e '$ d' ~/path/to/your/file/name
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.