这是大学提出的问题。
问题是:列出testfiles
文件夹中没有扩展名的所有文件/目录
给出的正确答案是:
ls testfiles | grep -v "\."
现在,只是为了了解ls
正则表达式是如何工作的,有人可以通过仅使用ls
来解释给我这样做吗?此外,我要感谢任何使用美元符号$
的示例,明确指出该名称以.[a-z]
结尾。
任何帮助,非常感谢。
还有一件事!这个问题的另一个答案是使用:
ls testfiles | grep "^[^.]*$"
怎么读?我这样阅读^[^.]*$
:
^ -> does not contain
[^.] -> starts with a dot
* -> repeated zero or more times
$ -> till the end
我希望有人在此纠正我... 谢谢!
答案 0 :(得分:3)
Unix实用程序应该用作过滤器,因此给出的答案是有意义的,因为它最接近真实世界的应用程序。
但您确实理解grep "\."
匹配所有内容的“句号”(因此,扩展名),grep -v "\."
匹配其他所有内容(即补语)。
很难让命令比现在更精确,因为谁可以说什么是扩展名,什么不是?
第2部分:ls testfiles | grep "^[^.]*$"
括号表达式是由[和]括起来的字符列表。 它 匹配该列表中的任何单个字符;如果是第一个字符 列表是插入符号^然后它匹配列表中没有的任何字符。 例如,正则表达式[0123456789]匹配任何单个 数字。
http://unixhelp.ed.ac.uk/CGI/man-cgi?grep
所以^[^.]*$
实际上意味着:
以字符串开头和结尾的任何内容,每个字符都不是句点。
第一个插入符不是否定,它意味着开始。第二个插入符号是“非”符号。
答案 1 :(得分:3)
校正:
^ -> pattern starts at the beginning of the string
[^.] -> matches something that is not a dot
* -> repeated zero or more times
$ -> and must continue to match (only non-dot items) until the end
因此,从开始到结束,它必须只有非点数。
答案 2 :(得分:3)
现在,只是为了理解ls正则表达式是如何工作的,有人可以通过仅使用ls向我解释这将是如何完成的吗?
您可以使用ignore标志:
ls -I '*.*'
注意 - 适用于CentOS 6,不确定其他Linux发行版。
答案 3 :(得分:0)
由于您使用bash标记了问题,因此您不需要grep:
shopt -s extglob
(cd testfiles && ls -d !(*.*))
请参阅http://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching