Emacs: открыть буфер со всеми строками между строками от X до Y из огромного файла

10

В том же духе, что и этот другой вопрос: cat line X - строка Y на огромном файле :

Есть ли способ открыть из Emacs (и показать в буфере) заданный набор строк (например, все строки между строкой Xи Y) из огромного текстового файла?

Например, открыть и показать в буфере все строки между строками 57890000 и 57890010 из файла huge.txt

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

Амелио Васкес-Рейна
источник
Вы хотите только увидеть или отредактировать?
Чороба
1
Как насчет изнутри ed? 57890000,57890010p
Кевин

Ответы:

7

Если вы хотите открыть весь файл (что требуется), но показать только его часть в окне редактора, используйте сужение . Выберите часть буфера, с которой вы хотите работать, и нажмите C-x n n( narrow-to-region). Скажите «да», если вы получите запрос об отключенной команде. Нажмите C-x n w( widen), чтобы снова увидеть весь буфер. Если вы сохраните буфер, будет выбран весь файл: все данные все еще там, сужение только ограничивает то, что вы видите.

Если вы хотите просмотреть часть файла, вы можете вставить его в текущий буфер shell-commandс помощью префиксного аргумента ( M-1 M-!); выполните соответствующую команду, чтобы извлечь нужные строки , например <huge.txt tail -n +57890001 | head -n 11.

Существует также функция Lisp, insert-file-contentsкоторая может принимать диапазон байтов. Вы можете вызвать его с помощью M-:( eval-expression):

(insert-file-contents "huge.txt" nil 456789000 456791000)

Обратите внимание, что вы можете столкнуться с пределом целочисленного размера (зависит от версии и платформы, проверьте значение most-positive-fixnum).

Теоретически было бы возможно написать режим Emacs, который загружает и сохраняет части файлов прозрачно по мере необходимости (хотя ограничение на целочисленные размеры сделает невозможным использование фактических смещений файлов на 32-битных машинах). Единственное усилие в этом направлении, о котором я знаю, это VLF (ссылка на GitHub здесь ).

Жиль "ТАК - перестань быть злым"
источник
1

Вы можете найти эту комбинацию perl и elisp полезной. Это позволяет передавать данные в буфер. Последующие вызовы с использованием того же самого имени буфера добавят новые строки в тот же буфер.

Вы можете «отредактировать» буфер , но редактирование никоим образом не отражает обратно к источнику (который является каналом ) ... Он не показывает номеров строк, хотя вы можете настроить ввод, чтобы включить нумерованный префикс для каждого линия.

from=50000000
  to=50000010
<file_50 head -n "$to" | tail -n +"$from" | e-sink.pl

В буфере:

<<<<< start: 2012-09-09T01:39:49
1000000
VSjU K97X5Z dFcc ZZd2OqQ PzbnphT
yQBTt LOic Ks sPXrq tty oy
dA8 SD BvO daZ KFPr44X
X0m3BI eR4go YjFp7e vbJr3oe Y0OGgH3 uPfz yfq59
we rm L9iD ugcJBND daS

7pO lwUFzNE HPlPW fmPZ vpRs Rx EFeHaFM
b0 1B ncr Db324 vwO Un34R
HDZS wq9zg W013 5JGly
kAfP QPpjjyh pXMAw I1 CGKDc23 qCBnP
<<<<<   end: 0.630s

Или с добавленными номерами строк:

from=50000000
  to=50000010
<file_50 head -n "$to" | tail -n +"$from" | nl -v$from -ba -w${#to} | e-sink.pl

В буфере:

<<<<< start: 2012-09-09T01:53:44
50000000    1000000
50000001    VSjU K97X5Z dFcc ZZd2OqQ PzbnphT
50000002    yQBTt LOic Ks sPXrq tty oy
50000003    dA8 SD BvO daZ KFPr44X
50000004    X0m3BI eR4go YjFp7e vbJr3oe Y0OGgH3 uPfz yfq59
50000005    we rm L9iD ugcJBND daS
50000006    
50000007    7pO lwUFzNE HPlPW fmPZ vpRs Rx EFeHaFM
50000008    b0 1B ncr Db324 vwO Un34R
50000009    HDZS wq9zg W013 5JGly
50000010    kAfP QPpjjyh pXMAw I1 CGKDc23 qCBnP
<<<<<   end: 0.768s

Я нашел это на StackOverflow Q / A

Peter.O
источник
1

Вы можете сделать это с помощью View Large Files , второстепенного режима emacs, предназначенного именно для этого случая.

Echsecutor
источник