Я пытаюсь использовать ed
для редактирования первой строки большого файла, но мне приходится ждать, ed
пока не будут прочитаны все строки. Есть ли способ остановить ed
чтение всего файла и начать редактирование немедленно, при этом текущая строка будет первой?
решение1
Как отметил shellter, ed
этого сделать нельзя. Большинство операций редактирования требуют перезаписи файла, на месте можно делать только замены, в этом случае можно использовать hexedit(1)
.
Наименее требовательный к памяти способ — это использование sed
операций, например, заменаАвгустсИюньв первой строке:
sed '1s/August/June/' FILE > NEWFILE
решение2
Невозможно остановить ed
чтение всего файла или автоматически сделать первую строку буфера редактирования текущей строкой после открытия документа в редакторе.
Редактор ed
всегда помещает вас на последнюю строку, затронутую командой (или сразу после или до команды d
), а чтение файла при запуске похоже на использование e filename
, которое сбрасывает текущий буфер редактирования, открывает указанный файл для редактирования и устанавливает текущей строку на последнюю строку, считанную из файла.
Если вы хотите внести изменения в большой документ неинтерактивным способом, то использование sed
или awk
может оказаться более удачной альтернативой, поскольку эти инструменты работают в потоках и по умолчанию не считывают весь документ в память.
Если вы действительно хотите интерактивно редактировать большие документы, вы можете попробовать разбить документ на части с помощью split
, отредактировать те части, которые вы хотите изменить (используя ed
или , vi
или любой другой редактор), а затем просто cat
объединить части вместе с помощью .
Гипотетический сеанс редактирования первых 5 строк огромного файла в формате ed
:
$ред e ! head -n 5 огромный файл 123 г/^/м0 w! {cat -;tail -n +6 огромныйфайл;} >огромныйфайл.новый В
То есть запрос на редактирование вывода head -n 5 hugefile
. Редактирование, которое я здесь выполняю, заключается в том, чтобы просто перевернуть строки ( g/^/m0
, "переместить каждую строку по очереди в положение перед первой строкой"). Затем записываю измененный буфер редактирования в команду оболочки, которая объединяет содержимое буфера со строкой 6 и далее от исходного файла. Результат записывается в файл с новым именем. Q
затем выходит из редактора.