我试图通过 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)
当您键入命令时,在调用任何程序(例如 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
到组合中,您就可以获得可能会显着改变您的职业生涯的体验。
归档时间: |
|
查看次数: |
247 次 |
最近记录: |