Как удалить определенные строки (используя номера строк) в файле?

Существуют определенные строки, которые я хочу удалить из файла. Предположим, что это строка 20-37, а затем строка 45. Как мне это сделать без указания содержимого этих строк?

27 голосов | спросил Tshepang 13 AMpWed, 13 Apr 2011 00:48:52 +040048Wednesday 2011, 00:48:52

4 ответа


29

С помощью sed, например:

sed '20,37d; 45d' < input.txt > output.txt

Если вы хотите сделать это на месте:

sed --in-place '20,37d; 45d' file.txt
ответил pdo 13 AMpWed, 13 Apr 2011 01:00:33 +040000Wednesday 2011, 01:00:33
5

Если файл удобно помещается в память, вы также можете использовать ed.
Команды очень похожи на sed выше, с одной заметной разницей : вам нужно передать список номера строк /диапазонов, подлежащих удалению в порядке убывания (от наивысшей линии нет /диапазона до самой низкой). Причина в том, что когда вы удаляете /вставляете /разделяете /объединяете строки с помощью ed, текстовый буфер обновляется после каждой подкоманды, поэтому, если вы удаляете некоторые строки, остальные следующие строки больше не будут находиться в том же положении в буфере, когда выполняется следующая подкоманда. Итак, вы должны начать назад 1 .
На месте :

ed -s in_file <<IN
45d
20,37d
w
q
IN

или

ed -s in_file <<< $'45d\n20,37d\nw\nq\n'

или

printf '%s\n' 45d 20,37d w q | ed -s in_file

Заменить w обряд с помощью ,p rint, если вы хотите напечатать полученный результат вместо записи в файл. Если вы хотите сохранить исходный файл в неприкосновенности и записать в другой файл, вы можете передать новое имя файла в подкоманду w rite:

ed -s in_file <<IN
78,86d
65d
51d
20,37d
w out_file
q
IN

1 Если вы не хотите вычислять новые номера строк после каждого d elete, что довольно тривиально для этого конкретного случая (после удаления строк 20- 37, т.е. 18 строк, строка 45 становится линией 27), чтобы вы могли запускать:

ed -s in_file <<IN
20,37d
27d
w
q
IN

Однако, если вам нужно удалить несколько номеров строк /диапазонов, работа в обратном направлении не требует больших усилий.

ответил don_crissti 28 Jpm1000000pmWed, 28 Jan 2015 22:39:37 +030015 2015, 22:39:37
1

Просто прочитайте его в памяти, измените его, а затем запишите. Вы можете сделать что-то вроде

filename = "foo"
f = open(filename, 'r+')                                                                                                                                 
linenums = [1, 3]                                                                                                                                            
s = [y for x, y in enumerate(f) if x not in [line-1 for line in linenums]]                                                                                                                                          
f.seek(0)
f.write(''.join(s))
f.truncate(f.tell())
f.close()

Протестировано 5-строчным файлом. Кредиты на http://pleac.sourceforge.net/pleac_python/fileaccess.html , см. раздел «Изменение файла на месте без временного файла». См. Также https://stackoverflow.com/questions/125703/как-ду-я-модификация-а-текстовый файл-в-питон

Некоторые примечания:

  1. Можно сначала обрезать файл, то напишите ему, а не напишите, затем усечь, как указано выше. Тем не менее, я не знаю флага Python, который позволяет читать, а затем делать усеченная запись. Но, может быть, я что-то отсутствует, поскольку документ не все так ясно. Что приносит меня к

  2. Иногда документы Python действительно сосать. Видеть http://docs.python.org/library/functions.html#open

      

    Режимы 'r +', 'w +' и 'a +' открывают файл для обновления (обратите внимание, что 'w +'   обрезает файл).

    Значит ли это что-нибудь для вас? Какие ад «открыт для обновления»?

  3. Я не знаю, выполняю ли это в python в отличие от чего-то unixy like редактор потока лучше. Это может быть более переносимым, но я не знаете, насколько переносимым является sed. я просто написал это так, потому что я больше комфортно с низким уровнем программирование, чем использование классического unix инструменты, которые хороши, если они это делают точно, что вы хотите, но (я думаю) обычно менее гибкие.

  4. Этот подход (манипулирование файлом в памяти) торгует памятью для диска пространство. Он должен работать Ok на машинах с несколькими Гб памяти для файлов вверх до нескольких сотен Мб. Python не обрабатывать строки очень эффективно, поэтому переход на C /C ++, например, немного увеличить производительность и значительно сокращают использование памяти.

ответил Faheem Mitha 14 PMpThu, 14 Apr 2011 14:04:00 +040004Thursday 2011, 14:04:00
0

Вы можете использовать Vim в режиме Ex:

 ex -sc '20,37d|45d|x' file
  1. d удалить

  2. x сохранить и закрыть

ответил Steven Penny 17 AMpSun, 17 Apr 2016 05:00:23 +030000Sunday 2016, 05:00:23

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132