셸에서 정규식을 사용하는 방법에 대해 두 가지 질문이 있습니다.
1. *의 사용
~에 따르면정규 표현식에 관한 Wikipedia 페이지:
*: 별표는 선행 요소가 0개 이상 있음을 나타냅니다. 예를 들어, ab*c는 "ac", "abc", "abbc", "abbbc" 등과 일치합니다.
그런데 을 작성하면 rm test*.iso
"test"와 ".iso" 사이에 있는지 여부에 관계없이 "test"로 시작하고 ".iso"로 끝나는 모든 파일이 삭제됩니다. 따라서 "tes.iso" 파일은 다음과 같습니다.아니요삭제되었습니다.
Wikipedia에 따르면 abc를 예로 들면 "ab*c"는 "ac"와 일치합니다. 따라서 rm ab*c
"ac" 파일을 삭제해야 합니다.Wikipedia에 설명된 대로 rm이 정규식을 사용하지 않는 이유는 무엇입니까?
2. - 및 ?를 사용합니다.
아직도 기반으로정규 표현식에 관한 Wikipedia 페이지:
?: 물음표는 앞에 요소가 0개 또는 1개 있음을 나타냅니다. 예를 들어, color?r은 "color" 및 "color"와 일치합니다.
+: 더하기 기호는 앞에 하나 이상의 요소가 있음을 나타냅니다. 예를 들어 ab+c는 "abc", "abbc", "abbbc" 등과 일치하지만 "ac"는 일치하지 않습니다.
"?"는 "*"처럼 보입니다. 이는 "?" 기호가 1개 또는 0개의 요소를 대체한다는 의미입니다(그러나 Wikipedia의 설명과 달리 이전 요소는 대체되지 않음).
"+"를 어떻게 사용하는지 모르겠습니다. 두 번째 질문입니다. 또한 정규 표현식과 rm, cp, ...
.
답변1
껍데기패턴 일치 기호에 설명된이 표준 문서.
문서의 소개 부분에서 알 수 있듯이 패턴 일치 표기법은 정규식 표기법과 관련이 있지만 약간 다릅니다.
특히 ?
셸 의 동작은 정규식 과 유사합니다 .
. (그러나 그 중 어느 것도 파일 이름 시작 부분의 a와 일치하지 않습니다.) 셸에는 특별한 패턴 일치 기능이 없습니다. 그러나 @HaukeLaging이 그의 답변에서 말했듯이 일부 쉘에는 정규식 표기법을 활성화하는 옵션이 있지만 그렇게 하는 것은 비표준입니다.*
.*
.
+
답변2
셸은 특정 조건(셸마다 다를 수 있음)에서만 정규식을 사용합니다.
bash
다음 명령을 사용하여 활성화해야 합니다 .shopt -s extglob
그런 다음 다음과 같은 것을 사용할 수 있습니다.
echo a*(b)c
Pattern Matching
의 블록을 참조하세요 man bash
.