在Bash中,当您键入ls *.out时,它将输出以.out结尾的列表。这是一个正则表达式吗?
如果是;当我输入echo a.out > test然后输入grep *.out test时,它不输出任何内容。
ls中的*与正则表达式中的*相同吗?
发布于 2017-05-14 23:13:59
如果您想搜索所有以.out结尾的文件,请尝试grep <string> *.out。
您可能还想阅读有关globbing的内容。
发布于 2017-05-14 23:16:50
要理解的主要内容是,您的函数正在扩展程序参数(传递给已执行程序的main函数)。阅读关于shell expansions (和globbing )的Bash章节
因此,您不应该输入ls "*.out",而应该只输入ls *.out,然后/bin/ls程序将随*.out的展开一起启动。例如,如果您有文件a.out、b.out、cc.out、a.c,则*.out的扩展(由外壳完成)是a.out b.out cc.out,因此/bin/ls获得"ls" "a.out" "b.out" "cc.out",然后是NULL作为其main的第二个参数,第一个参数是4。
但是grep确实想要一些或"regexp“。您通常希望引用它(以避免shell尝试其扩展)。
发布于 2017-05-14 23:32:15
它是展开文件名globs的shell,因此在ls *.out和grep *.out test中,shell都会将文件名填充到命令行中,而命令本身只能看到生成的名称列表。假设您有名为foo.out和bar.out的文件,这些命令等同于以下命令:
ls bar.out foo.out
grep bar.out foo.out test第一个命令要求ls列出文件,第二个命令要求grep在文件foo.out和test中查找模式bar.out。后者可能不是您想要的,所以引用grep的模式:
grep "*.out" test但这并不是一个真正有效的正则表达式。在文件名globs中,星号*匹配零个或多个字符,在正则表达式中,它匹配零个或多个前一项(括号中的字符、字符组或表达式),但在行的开头没有任何项,因此该表达式意义不大。Perl抱怨这一点,而grep和sed没有,但它们似乎也不匹配任何东西。
在正则表达式中,点.表示任何字符,因此需要进行转义才能从字面上获取。另外,grep会在行中的任何位置查找匹配项,因此可以省略前导.* (可以匹配任意数量的任意字符)。因此,这将在文件test中查找包含字符串.out的行
grep "\.out" test正如我们所看到的,Bash使用的模式和grep使用的模式(正则表达式)是不同的。例如,参见Bash's manual for the pattern matches used in filename expansion和man page regex(7) for regular expressions。还要注意的是,正则表达式有不同的方言,它们之间并不完全兼容。
https://stackoverflow.com/questions/43965413
复制相似问题