![使用grep過濾帶有數字的資料夾](https://rvso.com/image/1618326/%E4%BD%BF%E7%94%A8grep%E9%81%8E%E6%BF%BE%E5%B8%B6%E6%9C%89%E6%95%B8%E5%AD%97%E7%9A%84%E8%B3%87%E6%96%99%E5%A4%BE.png)
我試圖僅列出帶有數字過濾的資料夾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 .
。
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
到混合中,您就可以獲得可能極大改變您職業生涯的經歷。