我是 Linux 新手,到目前为止我一直在使用一些实用程序,特别是 grep 实用程序。我决定创建一个包含以下内容的新文件(恰当地称为“newfile”):
Lady of the night,
I hold you close to me,
And everything is out of sight,
I think I'll be alright.
当我尝试通过输入“grep .* newfile”通过 grep 运行它时,我期望只显示文件的行;然而,它打印了几个结果,首先是:
grep: ..: Is a directory
接下来是整个 .bash_history(为了使这篇文章简短起见,我将省略它),然后是 newfile 的内容。为什么会这样呢?有什么办法可以解决这个问题吗?我必须改变我的正则表达式吗?
答案1
做一个实验!跑步
echo grep .* newfile
从结果中你能得出什么结论?当您引用(放在单引号或双引号中)grep 的第一个参数时,结果如何变化?
如果你想直接了解这一点,请阅读路径名扩展的 POSIX 规范。了解有关各种扩展的一切将使您立即成为 shell 大师:-)
答案2
shell 正在解释您的*
,而不是将其grep
作为正则表达式传递。要使用正则表达式搜索grep
,您必须向它传递一个选项,告诉它“这是一个正则表达式” - 在我的安装中,它是-e
.尝试grep -e '.*' newfile
。
答案3
通过在星号 (.*) 和文件名 (newfile) 之前指定点,您可以告诉 grep 在文件 newfile 中查找模式.\*
,并且 shell 会扩展.\*
以包含目录中的点文件。
你可能想要这样的东西:
cat newfile
这将打印文件的行。