我试图仅列出带有数字的文件夹以过滤ls -1
(选项-1
是每行列出一个文件)通过 grep (我知道 find 也可以做到这一点,但为了举个例子,我还是坚持使用 grep)
文件夹是
PC:test user$ ls -1
1184
36
69929
7
9907
现在,这是我通过不同的输出所得到的结果......
这个:我不明白为什么 9907 在那里,因为不知何故只有个位数 7 文件夹才有意义?
PC:test user$ ls -1 | grep [0-9]
7
9907
缺少 7。.
平均值是 2 还是更大?
PC:test user$ ls -1 | grep [0-9].
1184
36
69929
9907
这是否意味着匹配其中的所有内容?
PC:test user$ ls -1 | grep [0-9].*
1184
36
69929
7
9907
当使用引号时,它就能像我预期的那样工作,那么为什么呢?它相当于 吗[0-9].*
?
PC:test user$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907
答案1
“文件名替换”或“路径名扩展”或“通配符”
当你输入一个命令时,它会经历几个阶段的潜在转换前任何程序(例如 grep)都会被调用。
[
在某些 shell 中是特殊字符。
$ echo [0-9]
7
我认为这里发生的事情是,shell 将 0-9 扩展为文件名选择,并找到您的“7”文件,因此将“7”传递给 grep。因此 grep 正在寻找文件名中任何位置包含“7”的文件名。
如果您希望[
由 grep 处理而不是由 shell 处理,则必须用引号括住该字符串或欺骗 shell 以不同的方式解析表达式。
$ echo [0-9].
[0-9].
建议引用。
另请参阅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
哎呀我把我的电脑弄坏了
不小心使用特殊字符会导致各种令人兴奋的结果
$ ls -1 > x
$ grep *
x:1184
如果你考虑一下,这应该会变得更加清晰
$ ls -1
1184
36
69929
7
9907
x
$ echo *
1184 36 69929 7 9907 x
现在只需添加rm
和sudo
混合,您就可以获得可能极大地改变您的职业生涯的经历。