Kyl*_*and 8 sed history regular-expression ed
该g
选项(例如s/pattern/replacement/g
对于许多工具使用正则表达式风格的模式匹配和):g
的命令ed
,ex
,vi
,并vim
有相当类似的使用和意义:匹配给定的正则表达式“全球”,即第一比赛结束后不停止。
我对此有两个问题:
:g
命令还是g
模式匹配标志,在哪个工具中?看起来大多数在模式匹配中sed
使用g
标志的工具(例如)实际上只是直接或间接模拟ed
。例如,在后 Perl 时代,大多数使用正则表达式的工具都允许g
标记,因为 Perl允许,而 Perl 会出现,因为ed
-> sed
-> Perl
。因此,如果答案是“它们是在原始ed
工具中同时引入的,并且除此之外没有历史先例”,我也不会感到惊讶。global
选项(或命令)?它真的没有什么“全球性”的;该:g
命令与任何其他ed
命令一样采用一系列行,并且该g
标志不会以任何方式扩展搜索范围(它只允许多次点击)。我想我想不出更好的名字,但所选的名字对我来说似乎很奇怪,所以我想知道是否有一些我没有看到的原因。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 第二天早上把它留在了他的桌子上)
我相信他们都是同时出现的ed
,或者可能是QED
。它们对于使用ed
. 如果有一个版本两者都不具备,我无法想象它会如何运作。
g//
和//g
是两个完全不同的东西。实际上这里发生了几件事。
//
用于搜索包含该模式的文件中的下一行,它只能返回一行(注意这1,$/./
是无效的)。g//
用于在多行上搜索模式,默认为全部或指定范围。它可以返回多行。//g
单独是没有意义的,也不是有效的命令ed
(尽管其他一些引擎接受它,但它在功能上是相同的//
)。s//
用于替换当前(或指定)行上模式的第一个实例。s//g
用于替换当前(或指定)行上模式的所有实例。我希望这至少能在一定程度上消除混乱。但我认为你问题的答案的要点是这是两件不同的事情。每个都有不同的用途,并且意味着不同的事情。