Bash

ls -l 使用正則 grep 表達式

  • April 10, 2021

我們有以下 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

引用自:https://unix.stackexchange.com/questions/558806