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

Обновлено: 07.07.2024

У меня есть файл, foo.txt , содержащий следующие строки:

Мне нужна простая команда, в результате которой содержимое foo.txt будет:

Использование GNU sed :

Опция -i не существует в версиях GNU sed старше 3.95, поэтому вы должны использовать ее в качестве фильтра с временным файлом:

Конечно, в этом случае вы также можете использовать head -n -1 вместо sed .

Это, безусловно, самое быстрое и простое решение, особенно для больших файлов:

Если вы хотите удалить верхнюю строку, используйте следующее:

, Что означает выходные линии, начинающиеся со строки 2.

Не используйте sed для удаления строк из верхней или нижней части файла-это очень медленно, если файл большой.

У меня были проблемы со всеми ответами здесь, потому что я работал с огромным файлом (

300 ГБ), и ни одно из решений не масштабировалось. Вот мое решение:

В словах: узнайте длину файла, который вы хотите закончить (длина файла минус длина его последней строки, используя bc ), и установите эту позицию, чтобы быть концом файла (путем dd ing один байт /dev/null на него).

Это быстро, потому что tail начинает чтение с конца, и dd перезапишет файл на месте вместо копирования (и разбора) каждой строки файла, что и делают другие решения.

Примечание: это удаляет строку из файла на месте! Сделайте резервную копию или протестируйте фиктивный файл, прежде чем опробовать его на своем собственном файле!

Если вы хотите удалить только последнюю строку вывода без изменения самого файла, сделайте

sed -e '$ d' foo.txt

Если вы хотите удалить последнюю строку самого входного файла, сделайте

sed -i '' -e '$ d' foo.txt

Для Пользователей Mac:

На Mac, head-n -1 не будет работать. И я пытался найти простое решение [ не беспокоясь о времени обработки], чтобы решить эту проблему только с помощью команд "head" и/или "tail".

Я попробовал следующую последовательность команд и был счастлив, что смог решить ее, просто используя команду "tail" [с опциями, доступными на Mac ]. Итак, если вы находитесь на Mac и хотите использовать только "хвост" для решения этой проблемы, вы можете использовать следующую команду:

Кот файл.txt / tail-r / tail-n +2 / tail-r

Пояснение:

1> tail-r: просто меняет порядок строк на своем входе

2> tail-n +2: выводит все строки, начиная со второй строки на входе

По существу, этот код говорит следующее:

Для каждой строки после первой выведите буферизованную строку

Для каждой строки сбросьте буфер

Буфер запаздывает на одну строку, поэтому вы в конечном итоге печатаете строки от 1 до n-1

Оба эти решения представлены здесь в других формах. Я нашел их немного более практичными, ясными и полезными:

Используя dd:

Использование усечения:

мой профессор сказал нам создать программу , которая сможет добавлять, перечислять и удалять записи сотрудников, и моя проблема здесь заключается в том, что я не знаю, как я могу удалить запись из файла . код, который я использую, - это только копирование содержимого исходного файла, а не нового содержимого.

3 ответа

Как я могу удалить определенную строку в текстовом файле?

Можете ли вы помочь мне закодировать программу, которая удаляет определенную строку в текстовом файле? Я планирую использовать: fgets захватывает строку из текстового файла и сохраняет ее в массиве, но я был сбит с толку, Как fgets хранит строку в массиве(захватывает ли он строку и сохраняет ее в.

я не знаю, как я могу удалить запись из файла . код, который я использую, копирует только содержимое исходного файла, а не новое содержимое.

Вы не можете удалить определенную строку из текстового файла. Вы можете только переписать одно и то же содержимое до строки, которую хотите удалить, в другой файл, пропустить удаляемые строки и продолжить запись rest содержимого.

После этого удалите исходный файл и переименуйте новый файл как исходный.

Ваш код делает то же самое, и все в порядке.

Другой альтернативой будет хранение текущего содержимого файла в структуре данных, такой как вектор. Внесите свои изменения, такие как удаление/добавление в структуру данных.

Затем запишите содержимое структуры данных обратно в файл.

Один из распространенных способов 'delete' вещей в файлах состоит в том, чтобы на самом деле не удалять их вообще, а либо установить флаг, чтобы сказать, что они удалены, либо удалить их другим способом. Например, можно было бы иметь формат

Затем это можно удалить, установив начальное значение 1 на 0.

Затем вы можете переписать файл и удалить все удаленные файлы позже. Альтернативой было бы просто заполнить строку пробелами и позволить вашей программе пропускать пустые строки.

Согласно вашему вопросу, это сработает.

Похожие вопросы:

Есть ли эффективный способ обновить / удалить определенную строку в файле CSV? Любой другой метод включал в себя чтение содержимого всего файла, создание временного файла, а затем замену им старого.

у меня есть проблема: я хочу найти строку, содержащую определенную строку, но я знаю только, как заменить строку в файле или все строки, Я знаю команду string.Contains, но она, кажется, не работает.

Как я могу удалить определенную строку в текстовом файле?

Можете ли вы помочь мне закодировать программу, которая удаляет определенную строку в текстовом файле? Я планирую использовать: fgets захватывает строку из текстового файла и сохраняет ее в массиве.

Я нашел так много примеров использования sed/grep для удаления определенной строки в текстовом файле, но я хочу иметь возможность удалить эту строку и строку непосредственно над ней. Есть идеи, с.

Я хочу удалить строку, содержащую определенную строку из моего файла. Я делаю это так: sed -i /example/d myfile Но мой файл содержит много строк, содержащих строки, содержащие строку, которую я хочу.

Я пытаюсь удалить определенную строку из datatable. При добавлении последней строки Мне нужно удалить строки желтого цвета. Это очень легко выбрать из datatable, как показано ниже DataRow[] dr =.

Как я могу удалить определенную строку в Julia? Допустим, у меня есть массив: [A , 2 B , 4 C , 6] Я хочу удалить строки, для которых 'B' находится в первом столбце. Я могу определить, какая это.

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

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

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

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

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

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

К сожалению, хотя нужно использовать более сложные методы, чтобы удалить, скажем, последние две строки. @Rob: sed '$d' file фактически не изменяет файл; он просто распечатывает содержимое файла, за исключением последней строки. Таким образом, sed '$d' file; sed '$d' file будет распечатывать содержимое файла дважды , минус последняя строка каждый раз. Эквивалент delete-the-last-two-line sed '$d' file равен is sed '$d' file | sed '$d' . Да, это не элегантно, но, конечно, это работает. Я бы сделал это за один проход с sed -n '1; $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 или для версии BusyBox head . @dubiousjim: Согласен, 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 эта опция не описана

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

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

Как удалить последний символ строки в Python?

Самый простой - это

как указал @greggo

Как вы говорите, для этого не нужно использовать регулярное выражение. Ты можешь использовать rstrip .

Если их больше одного / в конце это удалит все из них, например '/file.jpg//' -> '/file.jpg' . Судя по вашему вопросу, я полагаю, что это будет нормально.

Вы могли бы использовать String.rstrip .

Для пути используйте os.path.abspath

  • os.path.abspath() также превратит все косые черты в обратную косую черту на платформах Windows, поэтому это не всегда может быть правильным решением.
  • кроме случаев, когда реальная цель имеет действительный путь (даже в Windows)
  • Ты прав. Это путь. По какой-то причине я подумал, что это URL. abspath() здесь уместно.

Самый простой способ - использовать срез. Если x - ваша строковая переменная, то x [: - 1] вернет строковую переменную без последнего символа. (Кстати, x [-1] - последний символ в строковой переменной) Вы ищете

Отвечая на вопрос: чтобы удалить последний символ, просто используйте: string = string[:-1] .

Если это путь, используйте os.path функции:

хотя я бы добавил в конце косую черту, чтобы не пропустить имя файла, если в конце исходной строки нет косой черты:

При использовании abspath (если путь не является абсолютным, я думаю) добавит текущий рабочий каталог к ​​пути.

Чтобы удалить последний символ, просто используйте срез: my_file_path[:-1] . Если вы хотите удалить только определенный набор символов, используйте my_file_path.rstrip('/') . Если вы видите строку как путь к файлу, операция - os.path.dirname. Если путь на самом деле является именем файла, мне, скорее, интересно, откуда вообще взялась лишняя косая черта.

Не нужно использовать дорого regex , если это не нужно, попробуйте - Используйте r'(/)(?=$)' шаблон, который захватывается последним / и заменить на r'' т.е. пустой символ.

Читайте также: