셸의 정규식

셸의 정규식

쉘 내에서 정규식을 사용하는 것에 대해 두 가지 질문이 있습니다.

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.

관련 정보