bash 正则表达式:星号使用 grep 给出不明确的搜索结果

bash 正则表达式:星号使用 grep 给出不明确的搜索结果

*我正在使用一个简单的文本文件通过 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.txta*将会变成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

相关内容