Есть определенные строки, которые я хочу удалить из файла. Допустим, это строка 20-37, а затем строка 45. Как бы я это сделал, не указав содержание этих строк?
text-processing
tshepang
источник
источник
Ответы:
С
sed
, вот так:Если вы хотите сделать это на месте:
источник
ed
, или GNU sed-i
, илиsponge
, или метод большого файла .This option specifies that files are to be edited in-place. GNU
sed 'делает это, создавая временный файл и отправлять вывод в этот файл, а не в стандартный вывод. ... Я не знаю ни о каком другом «sed», но логика обновления «на месте» с помощью потокового редактора не «вычисляет» :)Если файл удобно помещается в памяти, вы также можете использовать
ed
.Команды очень похожи на приведенную
sed
выше, но с одним заметным отличием : вы должны передать список номеров строк / диапазонов, которые должны быть удалены, в порядке убывания (от самой высокой строки / диапазона до самой низкой). Причина в том, что когда вы удаляете / вставляете / разделяете / соединяете строки сed
, текстовый буфер обновляется после каждой подкоманды, поэтому, если вы удаляете некоторые строки, остальные следующие строки больше не будут находиться в той же позиции в буфере, следующая подкоманда выполнена. Таким образом, вы должны начать назад 1 . Редактирование наместе :
или
или
Замените
w
rite на,p
rint, если вы хотите напечатать полученный результат вместо записи в файл. Если вы хотите сохранить исходный файл без изменений и записать в другой файл, вы можете передать новое имя файлаw
подкоманде rite:1 Если вы не хотите рассчитывать новые номера строк после каждого
d
элемента elete, что довольно тривиально для этого конкретного случая (после удаления строк 20-37, т.е. 18 строк, строка 45 становится строкой 27), чтобы вы могли выполнить:Однако, если вам нужно удалить несколько номеров строк / диапазонов, работать в обратном направлении не составит труда.
источник
q
Полезна ли команда в конце? Я предполагаю, что это выходит так или иначе.Просто прочитайте это в память, измените это, затем запишите это назад. Вы можете сделать что-то вроде
Протестировано с 5-строчным файлом. Кредиты http://pleac.sourceforge.net/pleac_python/fileaccess.html см. В разделе «Изменение файла на месте без временного файла». Смотрите также /programming/125703/how-do-i-modify-a-text-file-in-python
Некоторые заметки:
Можно сначала обрезать файл, затем записать в него, а не писать, а затем обрезать, как указано выше. Однако я не знаю флага Python, который позволяет читать, а затем выполнять усеченную запись. Но, может быть, я что-то упустил, так как документ не совсем ясен. Что подводит меня к
Иногда документы Python действительно отстой. См. Http://docs.python.org/library/functions.html#open.
Это что-то значит для тебя? Что, черт возьми, «открыто для обновления»?
Я не знаю, лучше ли делать это в python, в отличие от чего-то юниксного, такого как потоковый редактор. Это может быть более портативным, но я не знаю, как портативный SED. Я просто написал это так, потому что мне удобнее программировать на низком уровне, чем использовать классические инструменты Unix, которые хороши, если они делают именно то, что вы хотите, но (я думаю), как правило, менее гибкие.
Этот подход (манипулирование файлом в памяти) меняет память на дисковое пространство. Он должен нормально работать на машинах с несколькими ГБ памяти для файлов размером до нескольких сотен МБ. Python не очень эффективно обрабатывает строки, поэтому, например, переход на C / C ++ немного повысит производительность и значительно сократит использование памяти.
источник
Вы можете использовать Vim в режиме Ex:
d
удалятьx
сохранить и закрытьисточник