^ 和 $ 何时以及为何具有“行开头”和“行结尾”的含义?

^ 和 $ 何时以及为何具有“行开头”和“行结尾”的含义?

许多命令行工具(grepflex等)使用^符号来表示“行的开头”,使用$符号来表示“行的结尾”。这个约定是什么时候产生的?为此目的保留两个字符似乎是完全合理的,但在现代键盘上,该符号位于该符号$的左侧,这有点奇怪。^

这是一个完全武断的决定吗?这是否来自一些较旧的键盘布局?使用此约定是否是因为某些较旧的工具决定以这种方式执行操作?

无论答案如何,是否有主要来源记录这一点?

答案1

QED 编辑器,写于 1965 年伯克利分时系统$用于寻址文件中的最后一行,就像今天ed一样。看exvivim手册第 2-1 页。但最初的 QED 编辑器不允许使用正则表达式。

Ken Thompson 后来(“1960 年代末”)为 Multics 编写了 QED 版本,这是第一个实现正则表达式的编辑器。该编辑器对 Ken 1969 年的edUnix 开发产生了重大影响(后来由 Dennis Richie 于​​ 1971 年左右“定稿”)。 Bill Joy 出于对 的不满ed,实施了exvi,这些是 1977 年 PDP-11 的第一个 BSD 版本的一部分。

^and表达式$以及后来成为 POSIX 正则表达式语法的大部分内容及其如今所具有的语义,均在 Ken 的 QED 版本中实现。看手册第 4 页

目前尚不清楚这些特定符号的选择来自何处,但从$用于寻址最后一行的方式来看,它已经具有“最后”的含义。

在某些终端上,^无法生成该字符。因此允许\'使用Ken 的 QED 编辑器来代替^(参见贝尔实验室手册)。

答案2

此副本ed(I),日期为 11/3/71,来自 Unix 第一版,确认 是ed基于 QED,并表明^$具有当时的当前含义:

  1. ^正则表达式开头的扬抑符 ( ) 与行开头的空字符匹配。
  2. 正则表达式末尾的货币符号 ( $) 与行末尾的空字符匹配。

此注维基百科页面 grep 表明它 grep创建于 20 世纪 70 年代初,并使用与 相同的正则表达式语法 ed


正则表达式的概念比它在计算机实用程序中的使用早了近二十年。  维基百科“正则表达式”页面 和 这个堆栈溢出问题 相信美国数学家 Stephen Cole Kleene 发明了正则表达式,或者至少描述了它们并创造了这个术语。许多历史文献都提到了他的论文, 神经网络和有限自动机中的事件表示(PDF)。这份 101 页的文件,日期为 1951 年 12 月 15 日,很难阅读,而且(据我所知)不是提及^and$语法。然而,它*在论文第 49 页(PDF 文件第 52 页)上确实表示为“零个或多个前面的事物”。这(在某种程度上)被广泛称为“克林星”。

相关内容