Bash
ls -l 使用正則 grep 表達式
我們有以下 1000 個文件
ls -ltr | grep list_of_cars | sort -rw-r--r-- 1 root root 259 Dec 24 16:29 list_of_cars-0.json -rw-r--r-- 1 root root 259 Dec 24 16:29 list_of_cars-1.json -rw-r--r-- 1 root root 259 Dec 24 16:29 list_of_cars-2.json . . . -rw-r--r-- 1 root root 260 Dec 24 16:29 list_of_cars-996.json -rw-r--r-- 1 root root 260 Dec 24 16:29 list_of_cars-997.json -rw-r--r-- 1 root root 260 Dec 24 16:29 list_of_cars-998.json -rw-r--r-- 1 root root 260 Dec 24 16:29 list_of_cars-999.json
但是當我嘗試使用
list_of_cars-[0-999].json
以下正常語法擷取所有文件時,我們只得到 10 個文件而不是 1000 個,為什麼?ls -ltr | sort | awk '{print $NF}' | grep "^list_of_cars-[0-999].json" list_of_cars-0.json list_of_cars-1.json list_of_cars-2.json list_of_cars-3.json list_of_cars-4.json list_of_cars-5.json list_of_cars-6.json list_of_cars-7.json list_of_cars-8.json list_of_cars-9.json
我錯在哪裡?
初步說明:使用基本正則表達式(預設)
grep
強制反斜杠轉義相當多的元字元(請參閱grep
手冊頁中的“基本與擴展正則表達式” )。我在下面的範例中避免了這些額外的轉義,因此您應該將它們用作擴展的正則表達式grep -E <regexp>
(或自己轉義相關的元字元)。在正則表達式
[0-999]
中表示“恰好匹配 0-9 或 9 或 9 範圍內的一個字元”您正在尋找的是(我將首先選擇最簡單的)“匹配 0-9 範圍內的任意數量的字元”,這將轉換為
[0-9]*
.還要注意
.
匹配任何字元。要精確匹配句點,您必須將值轉義為\.
所以你的最終正則表達式將是
^list_of_cars-[0-9]*\.json
現在,這將匹配 0 個或多個數字,因此
list_of_cars-.json
將匹配。我們可以通過詢問“匹配 0-9 範圍內的一個或多個字元”來限制一步,這將是^list_of_cars-[0-9]+\.json
如果你真的想確保你得到的結果不會超過 999 =>,我們可以通過指定“匹配 0-9 範圍內的 1 到 3 個字元”來更加嚴格
^list_of_cars-[0-9]{1,3}\.json