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

Обновлено: 07.07.2024

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

Если не трудно разжуйте тупому.

sed-4.2-1-setup установил.
что дальше хз. запукаю код пишет сед не является командой и т.д.


вообщем если будет желание напишите пожалуйста код для вырезания из
файла 1.txt (он лежит на диске С )
чтоб из него удалялись последние 3 строки.
и может еще че установить нужно ?

1>1.tmp sed -n "1,%lines% p" 1.txt
move 1.tmp 1.txt

Непредвиденное появление: %%i.

Вожу код в командной строке - вот что появляется - при этом на диске С
создается временный файл 1.tmp - его открывал в блокноте он пустой.

да или нет или все - все что не ввожу не приводит к результатам - потом
тхт файл 1 просто пустой! ставновится после открытия.

ввожу в ком строке echo %path%

Сохрани батник в файл, например в 1.cmd, что бы запустить просто щелкни по нему мышью. Так же можно его (1.cmd) исполнить из cmd.exe
И пропиши реальный путь:

не идет.. точнее тоже самое - тхт после выполнения батника - пустой.

@echo off
setlocal

1>1.tmp sed -n "1,%lines% p" 1.txt
move 1.tmp 1.txt

сохранил как батник(сменил расширение на смд) и запускаю.

:: файл 1.txt с предыдущим значением - просто одно число
0<1.txt set /p "num="

set /a num+=rand_num

:: Перезаписываем 1.txt
1>1.txt echo %num%

На диске D в папке 1_PR лежит файл 24_H.csv

24_H.csv имеет следующий формат -
число.месяц.год(пробел)время(ч:мин:сек);число

10.11.2009 23:00:00;44
11.11.2009;22
11.11.2009 1:00:00;33
11.11.2009 2:00:00;1
11.11.2009 3:00:00;3
11.11.2009 4:00:00;3
11.11.2009 5:00:00;77

- надо сделать так чтобы с конца этого файла удалялись строки
по времени !(дата игнорируется и на нее не смотрим)
- допустим прописано в батнике 2:00:00 значит
все нижние строки до 2:00:00 должны удалится
- тоесть должно получится так -

10.11.2009 23:00:00;44
11.11.2009;22
11.11.2009 1:00:00;33
11.11.2009 2:00:00;1

(строки
11.11.2009 4:00:00;3
11.11.2009 5:00:00;77
удалены)

Добавлено:
FGHGJGJSD22
Ortios
Найти последнюю строку с 2:00:00 можно так:

Но что делать, если я хочу удалить последнюю строку файла, и я не знаю количество строк (я знаю, что могу получить это, используя 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.

Я хочу удалить один или несколько конкретных номеров строк из файла. Как бы я сделал это с помощью sed?

Можете ли вы привести более конкретный пример того, что вы хотите? Как вы решите, какие строки удалить?

Если вы хотите удалить строки с 5 по 10 и 12:

Это выведет результаты на экран. Если вы хотите сохранить результаты в одном файле:

Это создаст резервную копию файла file.bak и удалит указанные строки.

Примечание. Номера строк начинаются с 1. Первая строка файла - 1, а не 0.

Не у всех юниксов есть gnu sed с "-i". Не делайте ошибку, возвращаясь к «sed cmd file> file», который уничтожит ваш файл. Что делать, если я хотел удалить 5-ю строку до последней строки? @BrianCampbell Что я должен сделать, чтобы удалить только определенную строку? @KanagaveluSugumar sed -e '5d' file . Синтаксис есть <address><command> ; где <address> может быть как одна строка 5 или ряд строк 5,10 , и команда d удаляет данную строку или строки. Адреса также могут быть регулярными выражениями или знаком доллара, $ обозначающим последнюю строку файла.

Вы можете удалить отдельную строку с ее номером

Это удалит строку с номером 33 строки и сохранит обновленный файл.

В моем случае «sed» убрал не ту строку. Поэтому я использую этот подход: sed -i '0,/<TARGET>/' '<SOME_FILE_NAME>' . Спасибо! То же самое, я написал цикл и, как ни странно, некоторые файлы потеряли правильную строку, но некоторые файлы потеряли еще одну строку, понятия не имею, что пошло не так. (GNU / Linux bash4.2) Команда awk ниже работала нормально в цикле Будьте очень осторожны, используя sort -r, если вы удаляете из списка строк, иначе ваш первый sed изменит номера строк всего остального! . Чтобы прокомментировать неправильные строки, удаляемые в цикле: обязательно начинайте с самого большого номера строки, в противном случае каждая удаленная строка будет NB: Эта строка awk работала для меня более надежно, чем вариант sed (между OS-X и Ubuntu Linux)

Это очень часто является признаком антипаттерна. Инструмент, который произвел номера строк, вполне может быть заменен инструментом, который сразу удаляет строки. Например;

(где deletelines находится нужная вам утилита)

Тем не менее, если вы находитесь в ситуации, когда вам действительно нужно выполнить эту задачу, вы можете сгенерировать простой sed скрипт из файла номеров строк. С юмором (но, возможно, немного смущающим) вы можете сделать это с sed .

Он принимает файл номеров строк, по одному на строку, и выдает на стандартном выводе те же номера строк с d добавлением после каждого. Это допустимый sed скрипт, который мы можем сохранить в файл или (на некоторых платформах) передать в другой sed экземпляр:

Как всегда, вы можете добавить -i перед -f опцией иметь возможность sed редактировать целевой файл на месте, вместо выдачи результата на стандартный вывод. На платформах * BSDish (включая OSX) вам также необходимо указать явный аргумент -i ; распространенная идиома - предоставить пустой аргумент; -i '' ,

Я не совсем согласен с «симптомом антипаттерна». Типы файлов на основе разметки (например, XML или JSON) требуют определенных строк в конце, чтобы быть действительными файлами. В этом случае зачастую наиболее разумный подход состоит в том, чтобы удалить эти строки, вставить в файл то, что вы хотите добавить, а затем повторно добавить эти строки, потому что поместить строки между ними может быть гораздо больше усилий, и это противоречит потенциальное желание избегать дополнительных инструментов, таких как sed, как можно больше. Я не совсем понимаю, какой сценарий вы представляете. Там являются сценарии , в которых это является законным подход , но подавляющее большинство случаев , которые я видел являются новичками , которые делают более или менее точно , что мой первый пример демонстрирует. (Возможно, они происходят от какого-то действительно низкоуровневого языка и привыкли делить свои проблемы далеко за пределы молекулярного уровня, потому что вы должны использовать asm или C.) Удаление материала по номеру строки из XML или JSON звучит крайне хрупко , если не прямо опасно. Под этим я в основном подразумеваю, что, как создатель такого файла, вы знаете, что должно быть в конце документа (т. Е. Набор закрывающих / квадратных скобок в последних нескольких строках для JSON, или точный закрывающие теги для XML). Помня об этом, самый простой подход к расширению такого документа: 1) удалить последние несколько строк, 2) добавить новый контент, 3) повторно добавить последние несколько строк. Таким образом, документ может быть действительным как до, так и после его расширения, без необходимости искать способ добавления строк в середине документа. Пока что это единственный ответ с подходящим решением для большого количества строк (т.е. предоставленный файлом). И предисловие тоже имеет смысл. Это заслуживает большего количества голосов. Кстати, если вы хотите печатать строки, а не удалять их, используйте p вместо d вместе с опцией -n (она не будет работать -n и !d не будет работать).

Я хотел бы предложить обобщение с помощью awk.

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

В этом примере размер блока равен 2000, и я хочу напечатать строки [1..713] и [1026..1029].

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