![grep 正则表达式与管道一起使用时会产生奇怪的结果](https://linux22.com/image/1142638/grep%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E4%B8%8E%E7%AE%A1%E9%81%93%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8%E6%97%B6%E4%BC%9A%E4%BA%A7%E7%94%9F%E5%A5%87%E6%80%AA%E7%9A%84%E7%BB%93%E6%9E%9C.png)
我有 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