쉘 내에서 정규식을 사용하는 것에 대해 두 가지 질문이 있습니다.
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개 있음을 나타냅니다. 예를 들어, colou?r은 "color"와 "color" 모두와 일치합니다.
+: 더하기 기호는 이전 요소가 하나 이상 있음을 나타냅니다. 예를 들어, ab+c는 "abc", "abbc", "abbbc" 등과 일치하지만 "ac"는 일치하지 않습니다.
"?" "*", 즉 "?"처럼 작동하는 것 같습니다. 기호는 하나 또는 0개의 요소를 대체합니다(그러나 위키피디아에서 말하는 것과 반대되는 이전 요소는 아닙니다).
"+"를 어떻게 사용하는지 모르겠어요. 이것이 두 번째 질문입니다. 또한 정규 표현식 및 rm, cp, ...
.
답변1
껍질의패턴 일치 표기법에 설명되어 있습니다.이 표준 문서.
문서의 소개 부분에서 알 수 있듯이 패턴 일치 표기법은 정규식 표기법과 관련이 있지만 약간 다릅니다.
특히 ?
셸에서는 .
정규식처럼 작동하고 *
셸에서는 .*
정규식처럼 작동합니다. (그러나 둘 중 어느 것도 .
파일 이름 시작 부분의 a와 일치하지 않습니다.) +
셸에는 특별한 패턴 일치 기능이 없습니다. 그러나 @HaukeLaging이 그의 답변에서 말했듯이 특정 쉘에서는 비표준이지만 선택적으로 정규식 표기법을 활성화할 수 있습니다.
답변2
쉘은 특정 조건에서만 정규식을 사용합니다(쉘마다 다를 수 있음).
bash
다음을 사용하여 활성화해야 합니다 .shopt -s extglob
그 후에는 다음과 같은 것을 사용할 수 있습니다:
echo a*(b)c
Pattern Matching
의 블록을 참조하세요 man bash
.