grep 正则表达式与管道一起使用时会产生奇怪的结果

grep 正则表达式与管道一起使用时会产生奇怪的结果

我有 3 个文件:test1、test2、test3.sh。文件 test3.sh 的内容为文件 test1 和 test2 的名称。我无法理解以下命令输出的结果:

sh-4.3$ touch test1 test2                                                                                                                                                       
sh-4.3$ ls                                                                                                                                                                      
main.sh  test1 test2                                                                                                                                                                                                                                                                                                
sh-4.3$ cat > test3.sh                                                                                                                                                          
test1                                                                                                                                                                           
test2                                                                                                                                                                           
sh-4.3$ cat test3.sh                                                                                                                                                            
test1                                                                                                                                                                           
test2                                                                                                                                                                           
sh-4.3$ ls                                                                                                                                                                      
main.sh  test1  test2  test3.sh                                                                                                                                                 
sh-4.3$ ls | grep test*  

test3.sh:test1

上面的 grep 命令给出了 test3.sh 文件中的匹配文本,但是 ls 命令的输出结果如何呢?因为它也包含单词“test”。shell 在进行模式搜索时是否忽略了 ls 命令的输出?

答案1

shell 会将你扩展*到当前目录中所有匹配的文件,然后才能grep看到它,所以扩展后的命令是

grep test1 test2 test3.sh

grep将第一个参数解释test1为要搜索的模式,将其他的参数解释为要查找的文件的名称。 的输出ls作为文本传递到的 STDIN 而不是文件名,并且似乎这被忽略了,因为在扩展完成后,grep它在 的语法中没有意义。grep

始终引用你的正则表达式

$ ls | grep 'test*'
test1
test2
test3.sh

相关内容