本着与其他问题相同的精神:将X行的Y行指向一个大文件中的Y行:
有没有一种方法可以从Emacs内部打开(并显示在缓冲区上)大型文本文件中的给定行集(例如line X
和之间的所有行Y
)?
例如,打开并在缓冲区中显示文件中第57890000行和57890010行之间的所有行 huge.txt
更新: 我对至少可以以只读方式打开行(仅出于显示目的)的解决方案感兴趣,尽管如果我还可以编辑行(并将其保存到原始文件中)将非常有用。
ed
怎么样?57890000,57890010p
本着与其他问题相同的精神:将X行的Y行指向一个大文件中的Y行:
有没有一种方法可以从Emacs内部打开(并显示在缓冲区上)大型文本文件中的给定行集(例如line X
和之间的所有行Y
)?
例如,打开并在缓冲区中显示文件中第57890000行和57890010行之间的所有行 huge.txt
更新: 我对至少可以以只读方式打开行(仅出于显示目的)的解决方案感兴趣,尽管如果我还可以编辑行(并将其保存到原始文件中)将非常有用。
ed
怎么样?57890000,57890010p
Answers:
如果您想打开整个文件(需要),但只在编辑器窗口中显示其中一部分,请使用缩小。选择要使用的缓冲区部分,然后按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链接)。
您可能会发现此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上找到了这个