![Emacs:打开一个缓冲区,其中包含大文件中 X 行到 Y 行之间的所有行](https://linux22.com/image/25309/Emacs%EF%BC%9A%E6%89%93%E5%BC%80%E4%B8%80%E4%B8%AA%E7%BC%93%E5%86%B2%E5%8C%BA%EF%BC%8C%E5%85%B6%E4%B8%AD%E5%8C%85%E5%90%AB%E5%A4%A7%E6%96%87%E4%BB%B6%E4%B8%AD%20X%20%E8%A1%8C%E5%88%B0%20Y%20%E8%A1%8C%E4%B9%8B%E9%97%B4%E7%9A%84%E6%89%80%E6%9C%89%E8%A1%8C.png)
本着与另一个问题相同的精神:将大文件中的 X 行猫到 Y 行:
有没有办法打开从 Emacs 内部(并在缓冲区上显示)来自一个巨大文本文件的给定行集(例如 lineX
和之间的所有行Y
)?
例如,打开文件并在缓冲区中显示第 57890000 行和第 57890010 行之间的所有行huge.txt
更新: 我对至少可以以只读方式打开行(仅用于显示目的)的解决方案感兴趣,尽管如果我也可以编辑行(并保存到原始文件),那就太好了。
答案1
如果您想打开整个文件(需要 ),但在编辑器窗口中仅显示其中的一部分,请使用缩小。选择要处理的缓冲区部分并按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 位机器上无法使用实际文件偏移量)。据我所知,在这个方向上唯一的努力是甚低频(GitHub 链接这里)。
答案2
你可能会发现这个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 问答
答案3
你可以这样做查看大文件,一个专门为这种情况设计的 emacs 小模式。