/path/to/fname#line1242
有没有办法将文件中的特定行号作为路径名的一部分引用,或者以某种方式包裹指向行号的链接,它看起来/行为像路径名?例如,将上面的字符串提供给同一文件系统的另一个用户,以便他们可以轻松打开我的文件“fname”并立即位于其中的第 1242 行。
我正在考虑类似于 HTML 锚点的行为,它可以包含在页面的 URI 中,然后表现得就像链接一样。也就是说,它们可以提供给同一文件系统的其他用户,并向这些用户指示文件中的给定行,默认情况下打开文件到该行。我意识到在 UNIX 中唯一可以确实路径名的一部分可以是目录、文件和伪文件。但是,还有 glob、字符串扩展等,它们严格来说并不是路径名的一部分,但可以“舒适地”插入其中,而文件名可以被传递和引用,而不需要任何额外的命令。是否有一种内联方法可以模拟 UNIX 文件的锚点/链接行为?
我可以在我的“路径名”中包含命令替换sed "1242p"
和某种自引用,但随后我不再处理路径名,而只是处理文件上的命令。想一想,那么我就不会链接,只是提取一行。我根本想不出链接到特定行的方法(不忽略文件的其余部分)。
GNU bash,版本 3.2.51
答案1
您可以创建一个名为+view +1242 fname
.然后在该文件上调用vi
or :view
view '+view +1242 fname'
将打开fname
in并将光标放在第view
1242 行的开头(这里假设实现/ )。vim
vi
view
或者做:
ln -s / '+view +1242 '
所以你也是:
view '+view +1242 /etc/passwd'
查看/etc/passwd
第 1242 行。
或者:
touch '+exe "view +1242 \57etc\57passwd"'
那view
是:
view '+exe "view +1242 \57etc\57passwd"'
您还可以制作目标文件的顶行:
#! /usr/bin/less +1242
并使其可执行( )并执行它,以便在第1242行处chmod +x fname
打开它。less
答案2
事实上,没有办法链接到文件的一部分。链接是文件级工具,它们只允许访问特定名称下的文件,对文件内容不执行任何操作。
如果您只想从文件中读取,那么您可以使用命名管道:
mkfifo fname_line1242
while true; do sed -n '1242 { p; q; }' /path/to/fname >fname_line1242; done
然后任何读过的人都会看到……如果幸运的话,fname_line1242
第 1242 行。/path/to/fname
命名管道没有任何形式的同步,因此只有在一次只有一个读取器的情况下,这才会可靠地工作。
要使此功能适用于多个读者,您可以使用插座并运行socat
每次读取套接字时执行命令以生成内容。
socat -U UNIX-LISTEN:fname_line1242,unlink-early,fork EXEC:'sed -n -e 1242{ -e p -e q -e } /path/to/fname'
如果您想写入文件以替换 中的行/path/to/fname
,这是可能的,但要困难得多。您可以使用保险丝创建自定义文件系统,其中打开文件、读取、写入等操作执行您编写的代码。这需要付出巨大的努力,除非有人已经编写了一个可以实现您想要的功能的文件系统。
答案3
好吧,您可以为本地文件构建一个 URI,例如:
file:///home/user/filename
然后您可以插入 #Part3 指南:
file:///home/user/filename#Part3
html
但如果要使用浏览器读取该文件,则需要该文件位于其中。
真正的问题就变成了:什么程序(工具)将读取(显示)该文件?
如果您希望浏览器能够读取答案,那么答案就在上面。
如果您使用less
(手册页的常用读者),您可以直接 less 转到特定行:
less +20 filename
读取控制台开头第 20 行的文本文件。
如果您可以更改文件名以包含所需的行号。
像这样的东西:filename-line-233
,这会起作用:
$ filename=A-text-file-line-233
$ less +"${filename##*-}" "$filename"
可能还有其他工具可以适应这个想法。
答案4
使用 Markdown,您似乎可以引用文件中的行: