使用grep過濾帶有數字的資料夾

使用grep過濾帶有數字的資料夾

我試圖僅列出帶有數字過濾的資料夾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

現在只需添加rmsudo到混合中,您就可以獲得可能極大改變您職業生涯的經歷。

相關內容