lus*_*oog 21
权力grep
是自动机理论的神奇之处.GREP是Global Regular Expression Print的缩写.它的工作原理是构建一个自动机(一个非常简单的"虚拟机":不是图灵完成); 然后它"对输入流执行"自动机.
自动机是节点或状态的图形或网络.国家之间的过渡由受到审查的输入字符决定.特殊的机器人喜欢+
并*
通过循环回归自己来工作.类似的字符类[a-z]
由扇形表示:一个起始节点,每个字符分支到"辐条"; 并且通常辐条对单个最终状态具有特殊的"epsilon过渡",因此它可以与从正则表达式(搜索字符串)构建的下一个自动机相关联.epsilon转换允许状态的改变而不会在被搜索的字符串中向前移动.
编辑:看来我没有仔细阅读这个问题.
键入命令行时,它首先由shell预处理.shell执行别名替换和文件名通配.在替换别名(它们就像宏)之后,shell将命令行切换为参数列表(以空格分隔).此参数列表main()
作为整数计数(通常称为argc)传递给可执行命令程序的函数,并指向(void *)0
nul-terminated('\0'
)char数组的NULL 终止()数组.
个别命令会根据自己的意愿使用他们的参数.但是,如果给出-h
参数,大多数Unix程序都会打印友好的帮助消息(因为它以减号开头,它被称为选项).GNU软件也将接受"长形式"选项--help
.
由于不同版本的Unix程序之间存在很多差异,因此发现程序所需的确切语法的最可靠方法是询问程序本身.如果这不能告诉你你需要什么(或者它太难以理解),你应该接下来检查本地联机帮助页(man grep
).对于gnu软件,您通常可以从中获取更多信息info grep
.
ick*_*fay 12
shell执行globbing(从*
表单到文件名的转换).如果你有一个简单的C程序,你可以看到这个:
#include <stdio.h>
int main(int argc, char **argv) {
for(int i=1; i<argc; i++) {
printf("%s\n", argv[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后像这样运行:
./print_args *
Run Code Online (Sandbox Code Playgroud)
你会看到它打印出匹配的内容,而不是*
字面意思.如果你像这样调用它:
./print_args '*'
Run Code Online (Sandbox Code Playgroud)
你会看到它有文字*
.
shell将' *.*
'扩展为文件名列表,并将扩展的文件名列表传递给程序,例如grep
.该grep
程序本身并不做文件名的扩展.
所以,在回答你的问题时:grep
没有得到2个论点; shell将' *.*
'转换为grep
可以理解的东西.
GNU grep
是从Unix不同的grep
支持额外的选项,如-w
和-B
和-A
.
在我看来FreeBSD使用GNU版本grep
: