我有一个包含这样内容的目录 -
vishal.yadav@droid36:~/Shell$ ls
lazy_dog.txt ls-error.txt ls-output.txt ShellCommands.txt TheTimeMachineHGWells.txt words.txt words.txt.bak
如果我尝试使用ls | grep *.txt
,我会得到以下输出 -
ShellCommands.txt: $ cat > lazy_dog.txt
ShellCommands.txt: $ cat lazy_dog.txt
ShellCommands.txt: $ cat < lazy_dog.txt
ShellCommands.txt:input from the keyboard to the file lazy_dog.txt. We see that the result is the
如果我使用ls | grep .*.txt
,我会将其作为输出 -
lazy_dog.txt
ls-error.txt
ls-output.txt
ShellCommands.txt
TheTimeMachineHGWells.txt
words.txt
words.txt.bak
不是.*.txt
和*.txt
同一个吗?
在第一个命令中,ls
的输出是regex
的{{1}}还是grep
?
同样,对于第二个命令,list of files
或ls
的输出是{<1}}吗?
答案 0 :(得分:1)
执行ls -al
:
您会发现当前目录列为.
,之前的目录列为..
。
因此,当您说ls | grep .*.txt
时,.
将被视为当前包含.txt
的当前目录的路径匹配。
答案 1 :(得分:1)
在第一个命令(ls | grep *.txt
)中,ls
的输出被grep
完全忽略,因为它看到:
grep lazy_dog.txt ls-error.txt ls-output.txt ShellCommands.txt TheTimeMachineHGWells.txt
它有一个模式lazy_dog.txt
和四个文件,因此它依次读取每个文件以查找模式,并在匹配的输出行前面加上保存模式的文件的名称。如果只有一个文件名,则不会在匹配的行之前列出文件名。
grep
搜索包含文字{{ls-error.txt
,ls-output.txt
,ShellCommands.txt
,TheTimeMachineHGWells.txt
的四个文件中唯一的文件1}}是lazy_dog.txt
,这就是你在输出中看到的内容。请注意,包含ShellCommands.txt
的行也会匹配正则表达式(但不包括shell glob)。
在第二个命令(lazy_dogstxt
)中,没有匹配ls | grep .*.txt
的文件,因此该参数传递给.*.txt
未展开,因此它只有一个模式,因此它读取它的标准输入,这次是grep
的输出。所有文件名都与正则表达式ls
匹配(即使它们都不匹配shell glob .*.txt
),所以它们都列出了。请注意,它还会拾取许多其他行,即使只包含“etxt”,因为.*.txt
是.
元字符(并且grep
正则表达式匹配零或更多的任何字符串字符后跟一个任意字符然后.*.txt
。
答案 2 :(得分:0)
grep将模式.*.txt
视为正则表达式,而不是glob。
因此,您可以使用ls *.txt
或ls | grep .*txt