使用 grep 过滤带有数字的文件夹

cel*_*_82 2 grep regex

我试图通过 grep仅列出带有数字过滤的文件夹ls -1(选项-1每行列出一个文件)(我知道 find 也可以这样做,但是为了这个例子,我想坚持使用 grep)

文件夹是

PC:test user$ ls -1
1184
36
69929
7
9907
Run Code Online (Sandbox Code Playgroud)

现在这是我用不同的输出得到的......

这个:我不明白为什么 9907 在那里,因为不知何故,只有一位数的 7 文件夹才有意义?

PC:test user$ ls -1 | grep [0-9]
7
9907
Run Code Online (Sandbox Code Playgroud)

这是缺少 7. 是否.意味着 2 或更多?

PC:test user$ ls -1 | grep [0-9].
1184
36
69929
9907
Run Code Online (Sandbox Code Playgroud)

这是否意味着匹配所有带有数字的内容?

PC:test user$ ls -1 | grep [0-9].*
1184
36
69929
7
9907
Run Code Online (Sandbox Code Playgroud)

当在引号中时它就像我期望的那样工作,那为什么?它相当于[0-9].*?

PC:test user$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907
Run Code Online (Sandbox Code Playgroud)

Red*_*ick 5

“文件名替换”或“路径名扩展”或“通配”

当您键入命令时,在调用任何程序(例如 grep)之前,它会经历几个潜在的转换阶段。

[ 在某些 shell 中是一个特殊字符。

$ echo [0-9]
7
Run Code Online (Sandbox Code Playgroud)

我认为这里发生的是 shell 将 0-9 扩展为文件名选择并找到您的“7”文件,因此将“7”传递给 grep。因此,grep 正在寻找文件名中任何位置包含“7”的文件名。

如果您希望[由 grep 而不是由外壳程序处理,则必须引用字符串或诱使外壳程序以不同方式解析表达式。

$ echo [0-9].
[0-9].
Run Code Online (Sandbox Code Playgroud)

建议引用。

又见man bash (寻找for),man test和151页的


常用表达

在正则表达式中,.表示“任何单个字符”。所以[0-9].意味着任何数字后跟一个字符。文件名7缺少后者。


如果您希望 grep 查找单个数字文件名,您需要将表达式锚定到行的开头和结尾

$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907

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

哎呀我毁了我的电脑

不小心使用特殊字符会导致各种令人兴奋的结果

$ ls -1 > x
$ grep *
x:1184
Run Code Online (Sandbox Code Playgroud)

如果您考虑,这应该变得更清楚

$ ls -1
1184
36
69929
7
9907
x

$ echo *
1184 36 69929 7 9907 x
Run Code Online (Sandbox Code Playgroud)

现在只需添加rm和添加sudo到组合中,您就可以获得可能会显着改变您的职业生涯的体验。