Grep 排除通配符不起作用

Grep 排除通配符不起作用

我正在使用 Ubuntu 14.04 LTS。

我正在使用 grep,在将 grep 传输到 ls 时遇到了问题。所有示例都限于当前目录,非递归。

如果我想列出名称中包含数字的所有文件:

ls | grep [0-9]

如果我想列出所有以“d”、“h”、“m”为首字母的文件:

ls | grep ^[dhm]

如果我想列出所有以数字作为首字母的文件:

ls | grep ^[0-9]

但是,当我尝试使用!内部时[]!不包括:

user@host:~$ ls | grep [0-9]
1.log
2.log
3.log
hs_err_pid4015.log
Untitled 1.odt
v1.odt

user@host:~$ ls | grep [!0-9]
1.log
2.log
3.log
hs_err_pid4015.log
Untitled 1.odt
v1.odt

如果我尝试使用它,同样意味着^

user@host:~$ ls | grep ^[0-9]
1.log
2.log
3.log

user@host:~$ ls | grep ^[!0-9]
1.log
2.log
3.log

我花了几天时间阅读有关 grep 和通配符的其他帖子、手册页、文章等,但我搞不懂。我尝试将它们放入'和中",将两个通配符标志(^!)组合在[[]]等中。

没有什么显示与上述示例不同的输出。

请不要向我展示解决方案。解释我的错误,让我自己解决问题。

答案1

字符类中用于否定的 Regex 标记是^,不是!

因此你需要:

ls | grep '^[^0-9]'

如果您这样做ls | grep ^[!0-9],那么在内[]!将按字面意思处理,并0-9以通常的方式展开。

对于这种简单的任务,请使用 shell 通配符,Regex 对于这些来说有点太多了,并且也不会解析ls;您可以简单地执行以下操作:

ls [^[:digit:]]*
ls [![:digit:]]*

请注意,在通配符中,bash支持^、 和!作为字符类内的模式否定标记。

如果你不想依赖你locale

ls [^[0-9]]*
ls [![0-9]]*

相关内容