正则表达式 `/pattern/g` 和 ed `:g/pattern/`:哪个先出现,为什么是 `g`?

Kyl*_*and 8 sed history regular-expression ed

g选项(例如s/pattern/replacement/g对于许多工具使用正则表达式风格的模式匹配和):g的命令edexvi,并vim有相当类似的使用和意义:匹配给定的正则表达式“全球”,即第一比赛结束后不停止。

我对此有两个问题:

  • 哪个先出现,是:g命令还是g模式匹配标志,在哪个工具中?看起来大多数在模式匹配中sed使用g标志的工具(例如)实际上只是直接或间接模拟ed。例如,在后 Perl 时代,大多数使用正则表达式的工具都允许g标记,因为 Perl允许,而 Perl 会出现,因为ed-> sed-> Perl。因此,如果答案是“它们是在原始ed工具中同时引入的,并且除此之外没有历史先例”,我也不会感到惊讶。
  • 为什么将其称为global选项(或命令)?它真的没有什么“全球性”的;该:g命令与任何其他ed命令一样采用一系列行,并且该g标志不会以任何方式扩展搜索范围(它只允许多次点击)。我想我想不出更好的名字,但所选的名字对我来说似乎很奇怪,所以我想知道是否有一些我没有看到的原因。

JKi*_*rtz 7

vi 受ex启发,exed启发,edqed启发

QED早在 1960 年代后期就被Ken Thompson为麻省理工学院的“兼容分时系统”(伯克利分时系统的先前版本由巴特勒兰普森、L. Peter Deutsch 和 Dana Angluin 创建)共同开发——简而言之,汤普森在 qed 中添加了正则表达式(他做的远不止这些,但这超出了这个答案的范围。--贝尔实验室有更多关于 QED 的历史

qed中的一个命令是“G”或“Global”命令。它允许您一次对文件中的所有行进行操作(以前版本的 qed 是面向字符的,而不是面向行的。)

Grep 实际上是根据qed 中此命令的使用之一命名的 G/re/P(G全局、re正则表达式、P打印) 此命令用于G/bash/P打印出所有包含单词 bash 的行——这后来被包含在 ed 中,然后从 ed 中取出并制作成一个独立的功能(根据 Doug McIlroy 的说法,他让 Ken 为他做这件事,而 Ken 第二天早上把它留在了他的桌子上)


bah*_*mat 5

我相信他们都是同时出现的ed,或者可能是QED。它们对于使用ed. 如果有一个版本两者都不具备,我无法想象它会如何运作。

g////g是两个完全不同的东西。实际上这里发生了几件事。

  • //用于搜索包含该模式的文件中的下一行,它只能返回一行(注意这1,$/./是无效的)。
  • g//用于在多行上搜索模式,默认为全部或指定范围。它可以返回多行。
  • //g单独是没有意义的,也不是有效的命令ed(尽管其他一些引擎接受它,但它在功能上是相同的//)。
  • s//用于替换当前(或指定)行上模式的第一个实例。
  • s//g用于替换当前(或指定)行上模式的所有实例。

我希望这至少能在一定程度上消除混乱。但我认为你问题的答案的要点是这是两件不同的事情。每个都有不同的用途,并且意味着不同的事情。