Bash:文件中一行的路径或链接?

Bash:文件中一行的路径或链接?
/path/to/fname#line1242

有没有办法将文件中的特定行号作为路径名的一部分引用,或者以某种方式包裹指向行号的链接,它看起来/行为像路径名?例如,将上面的字符串提供给同一文件系统的另一个用户,以便他们可以轻松打开我的文件“fname”并立即位于其中的第 1242 行。

我正在考虑类似于 HTML 锚点的行为,它可以包含在页面的 URI 中,然后表现得就像链接一样。也就是说,它们可以提供给同一文件系统的其他用户,并向这些用户指示文件中的给定行,默认情况下打开文件到该行。我意识到在 UNIX 中唯一可以确实路径名的一部分可以是目录、文件和伪文件。但是,还有 glob、字符串扩展等,它们严格来说并不是路径名的一部分,但可以“舒适地”插入其中,而文件名可以被传递和引用,而不需要任何额外的命令。是否有一种内联方法可以模拟 UNIX 文件的锚点/链接行为?

我可以在我的“路径名”中包含命令替换sed "1242p"和某种自引用,但随后我不再处理路径名,而只是处理文件上的命令。想一想,那么我就不会链接,只是提取一行。我根本想不出链接到特定行的方法(不忽略文件的其余部分)。

GNU bash,版本 3.2.51

答案1

您可以创建一个名为+view +1242 fname.然后在该文件上调用vior :view

view '+view +1242 fname'

将打开fnamein并将光标放在view1242 行的开头(这里假设实现/ )。vimviview

或者做:

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,您似乎可以引用文件中的行:

github链接

相关内容