首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux grep " *.out“和ls *.out

linux grep " *.out“和ls *.out
EN

Stack Overflow用户
提问于 2017-05-14 23:01:55
回答 5查看 622关注 0票数 0

在Bash中,当您键入ls *.out时,它将输出以.out结尾的列表。这是一个正则表达式吗?

如果是;当我输入echo a.out > test然后输入grep *.out test时,它不输出任何内容。

ls中的*与正则表达式中的*相同吗?

EN

回答 5

Stack Overflow用户

发布于 2017-05-14 23:13:59

如果您想搜索所有以.out结尾的文件,请尝试grep <string> *.out

您可能还想阅读有关globbing的内容。

票数 1
EN

Stack Overflow用户

发布于 2017-05-14 23:16:50

要理解的主要内容是,您的函数正在扩展程序参数(传递给已执行程序的main函数)。阅读关于shell expansions (和globbing )的Bash章节

因此,您不应该输入ls "*.out",而应该只输入ls *.out,然后/bin/ls程序将随*.out的展开一起启动。例如,如果您有文件a.outb.outcc.outa.c,则*.out的扩展(由外壳完成)是a.out b.out cc.out,因此/bin/ls获得"ls" "a.out" "b.out" "cc.out",然后是NULL作为其main的第二个参数,第一个参数是4。

但是grep确实想要一些或"regexp“。您通常希望引用它(以避免shell尝试其扩展)。

票数 1
EN

Stack Overflow用户

发布于 2017-05-14 23:32:15

它是展开文件名globs的shell,因此在ls *.outgrep *.out test中,shell都会将文件名填充到命令行中,而命令本身只能看到生成的名称列表。假设您有名为foo.outbar.out的文件,这些命令等同于以下命令:

代码语言:javascript
复制
ls bar.out foo.out
grep bar.out foo.out test

第一个命令要求ls列出文件,第二个命令要求grep在文件foo.outtest中查找模式bar.out。后者可能不是您想要的,所以引用grep的模式:

代码语言:javascript
复制
grep "*.out" test

但这并不是一个真正有效的正则表达式。在文件名globs中,星号*匹配零个或多个字符,在正则表达式中,它匹配零个或多个前一项(括号中的字符、字符组或表达式),但在行的开头没有任何项,因此该表达式意义不大。Perl抱怨这一点,而grepsed没有,但它们似乎也不匹配任何东西。

在正则表达式中,点.表示任何字符,因此需要进行转义才能从字面上获取。另外,grep会在行中的任何位置查找匹配项,因此可以省略前导.* (可以匹配任意数量的任意字符)。因此,这将在文件test中查找包含字符串.out的行

代码语言:javascript
复制
grep "\.out" test

正如我们所看到的,Bash使用的模式和grep使用的模式(正则表达式)是不同的。例如,参见Bash's manual for the pattern matches used in filename expansionman page regex(7) for regular expressions。还要注意的是,正则表达式有不同的方言,它们之间并不完全兼容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43965413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档