Я хочу удалить несколько n строк из конца файла. Можно ли это сделать с помощью sed?
Например, чтобы удалить строки от 2 до 4, я могу использовать
$ sed '2,4d' file
Но я не знаю номеров строк. Я могу удалить последнюю строку, используя
$sed $d file
но я хочу знать способ удалить n строк с конца. Пожалуйста, дайте мне знать, как это сделать, используя sed или какой-либо другой метод.
sed
?sed $d file
возвращает ошибку Вместо этого $ d должно быть в кавычках, например:sed '$d' file
Ответы:
Я не знаю
sed
, но это можно сделать с помощьюhead
:источник
sed -e :a -e '$d;N;2,5ba' -e 'P;D' file
(,5
для последних 5 строк).head
, но не является стандартным. Действительно, стандарт дляhead
штатов:The application shall ensure that the number option-argument is a positive decimal integer.
head: illegal line count -- -2
Если жесткое кодирование n является опцией, вы можете использовать последовательные вызовы sed. Например, чтобы удалить три последние строки, трижды удалите последнюю строку:
источник
Из седьмой строки :
Кажется, это то, что вы ищете.
источник
10
in'$d;N;2,10ba'
Забавное и простое
sed
иtac
решение:НОТА
"
необходимы для оболочки, чтобы оценить$n
переменную вsed
команде. В одинарных кавычках интерполяция выполняться не будет.tac
являетсяcat
обратными, смman 1 tac
{}
вsed
там , чтобы отделить$n
иd
(если нет, то оболочка попытаться интерполировать не существующей$nd
переменной)источник
tac
на OSXport info coreutils
||brew info coreutils
;Используйте
sed
, но пусть оболочка выполняет математические расчеты, с целью использованияd
команды, задав диапазон (для удаления последних 23 строк):Чтобы удалить последние 3 строки, изнутри:
Дает количество строк в файле: скажем, 2196
Мы хотим удалить последние 23 строки, поэтому для левой стороны или диапазона:
Дает: 2174 Таким образом, оригинальная интерпретация sed после shell:
Благодаря
-i
редактированию на месте, файл теперь содержит 2173 строки!Если вы хотите сохранить его в новый файл, код:
источник
Вы можете использовать голову для этого.
использование
$ head --lines=-N file > new_file
где N - количество строк, которые вы хотите удалить из файла.
Содержимое исходного файла минус последние N строк теперь в new_file
источник
Просто для полноты я хотел бы добавить свое решение. Я закончил делать это со стандартом
ed
:Это удаляет последние 2 строки с помощью на месте монтажа (хотя он действительно использовать временный файл
/tmp
!!)источник
Чтобы обрезать действительно большие файлы на месте, у нас есть
truncate
команда. Он не знает о строках, ноtail
+wc
может преобразовывать строки в байты:Существует очевидное состояние гонки, если файл записывается одновременно. В этом случае может быть лучше использовать
head
- он считает байты от начала файла (разум дискового ввода-вывода), поэтому мы всегда будем усекать на границе строки (возможно, больше строк, чем ожидалось, если файл активно записывается):Удобная однострочная, если вы не сможете войти в систему, введя пароль вместо имени пользователя:
источник
Это может работать для вас (GNU sed):
источник
'
).d
,D
илиP
с GNU sed, а не в версии posix. Кажется, что строки не печатаются послеD
и сохраняются в рабочем буфере для нового цикла без перехода к концу строки действий.D
создания обратного эффекта.Большинство из приведенных выше ответов требуют команд / расширений GNU:
Для немного более портативного решения:
ИЛИ
ИЛИ
Где «10» - это «n».
источник
С ответами здесь вы уже узнали, что Sed не лучший инструмент для этого приложения.
Однако я думаю, что есть способ сделать это с помощью sed; Идея состоит в том, чтобы добавить N строк для хранения до тех пор, пока вы не сможете читать, не нажимая EOF. Когда нажмете EOF, распечатайте содержимое области удержания и выйдите.
Команда sed выше пропустит последние 5 строк.
источник
Попробуйте следующую команду:
источник
=
.tail -r
там, где другие использовали,tac
чтобы изменить порядок строк и сделать последниеn
строкиn
первыми.Это можно сделать за 3 шага:
а) Подсчитайте количество строк в файле, который вы хотите редактировать:
б) Вычтите из этого числа количество удаляемых строк:
c) Скажите sed удалить из этой строки номер (
$x
) до конца:источник
sed
для удаления строки с 7 по 10, то есть 4 строки, а не 3.Вы можете получить общее количество строк
wc -l <file>
и использоватьhead -n <total lines - lines to remove> <file>
источник
Это удалит последние 3 строки из
file
:for i in $(seq 1 3); do sed -i '$d' file; done;
источник
sed
.Я предпочитаю это решение;
где N - количество удаляемых строк.
источник
версия posix
источник
Чтобы удалить последние 4 строки:
источник
tac file | sed '1,4d' | tac
потому, что сортировка, а затем удаление префикса стоит много ресурсов.tac
команды для некоторых систем (например, FreeBSD?)Я придумал это, где n - это количество строк, которые вы хотите удалить:
Это немного кольцевой, но я думаю, что легко следовать.
источник
Для удаления последних N строк файла вы можете использовать ту же концепцию
Вы можете использовать комбо с хвостовой командой, чтобы перевернуть файл: если N равно 5
И этот путь работает также там, где
head -n -5 file
команда не запускается (как на Mac!).источник
Это удалит последние 12 строк
источник