find
저는 Linux 명령의 정규식 사용에 대해 매우 혼란스럽습니다.
나는 옵션이 있다는 것을 알고 있지만 regextype
, 그것이 없으면 현재 매뉴얼 페이지에 따르면 Emacs 정규 표현식을 사용해야 합니다. 이 페이지문자 클래스가 지원된다고 말하는 것 같습니다("POSIX 기능 입니다 "). 그러나 내 실험에서는 이것이 실제로 문자 클래스를 처리하는 고대 방식이라는 사실을 제외하고 는 작동 [[:ascii:]]
하거나 작동하지 않는 것으로 나타났습니다. 대신 이것을 사용해야 할 것 같은데 , 이는 다른 것 외에는 유니코드 문자에는 쓸모가 없습니다.[[:digit:]]
[[:alnum:]]
[a-zA-Z]
그래서 저는 regextype
로 이동하여 가능한 설정 목록을 얻을 수 있다는 것을 발견했습니다 find -regextype help
. 이는 다음을 제공합니다:
find: Unknown regular expression type ‘help’; valid types are ‘findutils-default’, ‘awk’, ‘egrep’, ‘ed’, ‘emacs’, ‘gnu-awk’, ‘grep’, ‘posix-awk’, ‘posix-basic’, ‘posix-egrep’, ‘posix-extended’, ‘posix-minimal-basic’, ‘sed’.
-regextype posix-basic
...그래서 예를 들어 를 포함하면 다음과 같은 작업을 실행할 수 있다고 가정합니다 .
find . -maxdepth 1 -regextype posix-basic -regex .*\d.*
이는 결과를 생성하지만 내가 기대했던 결과는 아닙니다. 현재 디렉터리의 모든 파일과 폴더 이름에는 소문자 "d"가 있습니다! 모든 이름에는 최소한 하나의 숫자가 있어야 합니다.
나는 Stack Exchange에서 꽤 많은 Linux find
정규식 질문을 살펴봤지만 "현대적인" 문자 클래스 처리를 보여주는 질문은 본 적이 없다고 생각합니다. regextype
다음과 같은 작업을 처리할 수 있는 옵션 이 있습니까 ?
find . -maxdepth 1 -regextype ??? -regex '.*\d{3}\s+.*'
내 말은 "세 자리 숫자 뒤에 하나 이상의 공백 문자가 포함되어 있음"입니다. 즉, Java, Python, Javascript 등과 같은 일반 언어의 정규식 규칙과 같은 것입니까?
나중에 댓글을 토대로
다음은 연습입니다. 디렉토리를 만들고 그 안에 임의의 이름을 가진 파일을 몇 개 넣으세요. 그런 다음 "ctb117b", "ctb117c", "trt117a"라는 이름의 파일을 추가합니다.
그런 다음 "117" 파일을 분리하고 싶습니다. "xxx0009333qqq"라는 파일이 있을 수 있습니다. 따라서 최신 정규식 엔진을 사용하면 예를 들어 다음과 같이 됩니다(앞의 ./ 허용).
find . -regex './\w{3}\d\{3}.*'
이러한 오래된 Linux 정규식 규칙을 사용하여 작동하려면 무엇을 작성해야 합니까?
find . -regextype posix-basic -regex '.*[[:digit:]]{3}.*'
아무것도 생산되지 않습니다. '.*[[:digit:]]+.*'
예를 들어 둘 다 아닙니다. 누구든지 충분히 관심이 있다면 귀하에게 적합한 것을 보여주세요(위 파일 목록).
답변1
나는 이것을 사용하는 것이 좋습니다:
find . -maxdepth 1 -regextype posix-extended -regex '.*[[:digit:]]{3}\s+.*'