다음과 같은 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
1000개가 아닌 10개의 파일만 표시됩니다. 이유는 무엇입니까?
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
내가 어디서 잘못됐나요?
답변1
예비 설명: 기본 정규식(기본값)을 사용하여 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