find 명령의 정규 표현식에 하이픈 -이 없는 이유는 무엇입니까?

find 명령의 정규 표현식에 하이픈 -이 없는 이유는 무엇입니까?

-예를 들어 파일 이름에 하이픈이 있는 파일을 식별하려면 정규식과 결합된 명령이 일치하지 않는 것 같습니다 test-19.1.txt.find

명령이 find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-z0-9\-\.]+\.txt' -exec echo {} \;bash 쉘에서 실행되었지만 해당 파일을 찾을 수 없습니다. 파일 이름에서 하이픈이 제거되면 정규식이 일치합니다.

테스트할 때 동일한 정규식을 사용하세요.regexr.com성공했습니다.

답변1

문자 클래스에 하이픈을 포함하려면 하이픈이 첫 번째 또는 마지막 위치에 있어야 합니다.

~에서매뉴얼 찾기 "GNU Emacs에서 사용되는 것과 거의 동일한 정규식 유형을 찾고 찾습니다."그리고로부터이맥스 매뉴얼:

  • [ ... ]
    • 을 포함하려면 그룹의 첫 번째 또는 마지막 문자로 ‘-’쓰거나 ‘-’범위 뒤에 배치하세요. 따라서 ‘[]-]’일치하는 ‘]’‘-’.

따라서 정규 표현식은 다음과 같아야 합니다.'.*/[a-z0-9.-]+\.txt'

POSIX BRE 및 ERE에서는 동일한 규칙이 적용됩니다.

<hyphen-minus>문자는 목록에서 처음(있는 경우 첫 문자 다음) 또는 마지막에 나타나는 경우 그 자체로 처리되거나 범위 표현식의 끝 범위 지점으로 처리됩니다. '^'예를 들어, 표현식 "[-ac]""[ac-]"동일하며 'a', 'c'또는 '-'; 및 를 제외한 모든 문자와 일치합니다. 표현식은 및 사이의 모든 문자와 "[^-ac]"일치합니다 . "[^ac-]"POSIX 로케일에서 해당 문자가 기호 뒤에 오기 때문에 유효하거나 동등합니다. a를 시작 범위 지점으로 사용하려면 대괄호 표현식에서 먼저 나오거나 조합 기호로 지정되어야 합니다. 예를 들어 a 또는 모든 문자 또는 0과 0(0 포함) 사이에서 정렬하는 정렬 요소와 일치합니다.'a''c''-'"[%--]"'%''-'"[--@]"'-''@'"[a--@]"'@''a''-'<hyphen-minus>"[][.-.]-0]"<right-square-bracket><hyphen-minus>

대괄호 표현식이 '-'및 를 모두 지정하는 경우 대괄호 표현식에서 첫 번째(있는 경우) 및 마지막에 ']'배치 ']'되어야 합니다 .'^''-'

일반적인 표현

실제로 대부분의 정규식 변형에는 하이픈 일치 규칙이 동일합니다.

하이픈은 여는 괄호 바로 뒤, 닫는 괄호 앞 또는 부정된 캐럿 뒤에 올 수 있습니다. [-x]둘 다 [x-]x 또는 하이픈과 일치합니다. x나 하이픈이 아닌 모든 문자 [^-x]와 일치합니다. [^x-]이는 이 튜토리얼에서 설명하는 모든 스타일에 적용됩니다.범위를 형성할 수 없는 문자 클래스의 다른 위치에 있는 하이픈은 리터럴이나 오류로 해석될 수 있습니다. 정규식 스타일은 이것과 매우 일치하지 않습니다.

문자 클래스 또는 문자 세트

답변2

노력하다;

find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-z0-9.-]+\.txt'

대괄호 표현식 내에서:

  • 대시에는 특별한 의미가 있습니다.범위. 이 특별한 의미는 대시가 시작 부분(선택 사항인 ^경우 사용된 경우 다음)이나 끝에 있는 경우에만 피할 수 있습니다.
  • 일반적으로 백슬래시는 다음 문자를 이스케이프하지 않으며 리터럴입니다 \. 특히: 이스케이프 포인트가 필요하지 않으며 -백슬래시를 사용하여 대시( )의 특별한 의미를 이스케이프할 수 있는 방법이 없습니다 .

[a-z0-9\-\.]따라서 귀하가 작성하는 내용은 ~(또는 단지) ​​범위 로 이해됩니다 .\\\

관련 정보