Grep排除通配符不起作用

Ili*_*kov 2 command-line regex grep wildcards

我正在使用 Ubuntu 14.04 LTS。

我正在玩 grep,我遇到了一个问题,将 grep 管道传递到 ls。所有示例仅限于当前目录,非递归。

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

ls | grep [0-9]
Run Code Online (Sandbox Code Playgroud)

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

ls | grep ^[dhm]
Run Code Online (Sandbox Code Playgroud)

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

ls | grep ^[0-9]
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

如果我尝试将它与 ^

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

user@host:~$ ls | grep ^[!0-9]
1.log
2.log
3.log
Run Code Online (Sandbox Code Playgroud)

我花了几天时间阅读有关 grep 和通配符的其他帖子、手册页、文章等,但我无法弄清楚。我试过把它们放在'and 中",结合通配符标志(^and ![[]]等等。

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

请不要告诉我解决方案。解释我的错误,让我自己解决。

hee*_*ayl 5

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

所以你需要:

ls | grep '^[^0-9]'
Run Code Online (Sandbox Code Playgroud)

如果你这样做ls | grep ^[!0-9],那么内[]!字面上处理,0-9以通常的方式展开。

同样对于这种琐碎的任务,使用shell globbing,Regex对于这些有点太多了,也不解析ls;你可以简单地做:

ls [^[:digit:]]*
ls [![:digit:]]*
Run Code Online (Sandbox Code Playgroud)

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

如果你不想依赖你locale

ls [^[0-9]]*
ls [![0-9]]*
Run Code Online (Sandbox Code Playgroud)