![bash 正则表达式:星号使用 grep 给出不明确的搜索结果](https://linux22.com/image/77350/bash%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%9A%E6%98%9F%E5%8F%B7%E4%BD%BF%E7%94%A8%20grep%20%E7%BB%99%E5%87%BA%E4%B8%8D%E6%98%8E%E7%A1%AE%E7%9A%84%E6%90%9C%E7%B4%A2%E7%BB%93%E6%9E%9C.png)
*
我正在使用一个简单的文本文件通过 grep测试元字符。文本文件如下:
1
11
111
1111
11111
111111
d
da
daa
daaa
b
bc
bcc
bccc
现在,当我使用 grep 搜索数字 1 时,如下所示:
grep 1* regex.txt
输出是
1
11
111
1111
11111
111111
d
da
daa
daaa
b
bc
bcc
bccc
即使在字符“d”的情况下,结果也与以红色突出显示的“d”相同,但在字符“a”和“b”的情况下,以下搜索命令没有输出:
grep a* regex.txt
grep b* regex.txt
并且以下命令给出了预期的输出
grep "a*" regex.txt
grep "b*" regex.txt
为什么这样?为什么bash
偏向字符“d”而不偏向“a”和“b”
答案1
发生这种情况是因为a*
和b*
没有被引用,因此被 shell 扩展前被传递到grep
.例如,考虑这个目录:
$ ls
afile.txt bfile.txt regex.txt
如果我尝试运行grep a* regex.txt
,a*
将会变成afile.txt
的搜索模式grep
。我们可以使用 bash 的调试选项(set -x
)来演示:
$ set -x
$ grep a* regex.txt
+ grep --color afile.txt regex.txt
d
它适用而不适用a
或的原因b
是您的当前目录中有一个名称以a
和开头的文件或目录。b
如果你不这样做,它会起作用:
$ ls
afile.txt bfile.txt regex.txt
$ grep a* regex.txt ## no output, it's searching for 'afile.txt'
$ rm afile.txt ## now there are no filenames starting with a
$ grep a* regex.txt
1
11
111
1111
11111
111111
d
da
daa
daaa
b
bc
bcc
bccc
为了避免这种情况,总是引用您的搜索模式:
grep "a*" regex.txt
或者
grep 'a*' regex.txt