수색…


통사론

  • $ shopt -u 옵션 # 배시의 기본 제공 '옵션'비활성화
  • $ shopt -s 옵션 # 배쉬의 기본 제공 '옵션'활성화

비고

문자 클래스

[] glob에 유효한 문자 클래스는 POSIX 표준에 의해 정의됩니다.

alnum 알파 ascii 빈 cntrl 숫자 그래프 낮은 인쇄 punct 공간 상단 단어 xdigit

내부 [] 안에는 하나 이상의 문자 클래스 나 범위를 사용할 수 있습니다 (예 :

$ echo a[a-z[:blank:]0-9]*

a 시작하고 소문자 또는 공백 또는 숫자가 오는 모든 파일과 일치합니다.

것을하지만 명심해야한다 [] 글롭에만 전적으로 부정하고 그것뿐만 아니라 부품 수있다. 무효화 문자 여는 다음의 첫 번째 문자 여야 합니다. [ 예 :이 표현식은 a 시작하지 않는 모든 파일과 일치합니다 a

$ echo [^a]*

다음은 숫자 또는 ^ 문자로 시작하는 모든 파일과 일치합니다.

$ echo [[:alpha:]^a]*

^ 가 리터럴 ^ 로 해석 되었기 때문에 a 제외한 문자로 시작하는 파일이나 폴더와 일치하지 않습니다 .

글자 이스케이프

파일이나 폴더에 glob 문자가 이름의 일부로 포함 된 경우 일 수 있습니다. 이 경우 리터럴 일치 순서로 앞에 \ 를 사용하여 glob을 이스케이프 처리 할 수 ​​있습니다. 또 다른 방법은 두 번 사용하는 것입니다 "" 또는 단일 '' 파일을 해결하기 위해 인용한다. Bash는 "" 또는 '' 로 묶인 glob을 처리하지 않습니다.

정규 표현식과의 차이점

glob와 정규 표현식 사이의 가장 중요한 차이점은 유효한 정규 표현식에 한정 기호와 한정 기호가 필요하다는 것입니다. 한정자 일치하는 것을 식별하고 정량는 규정과 일치하는 빈도를 알려줍니다. * glob에 해당하는 RegEx는 .* 입니다 . 는 임의의 문자를 나타내고 * 는 이전 문자의 0 개 이상의 일치를 나타냅니다. 해당 RegEx는 ? glob가 .{1} 입니다. 이전과 마찬가지로 한정어 . 모든 문자와 일치하고 {1} 은 앞의 한정자와 정확히 일치하는 것을 나타냅니다. 이것과 혼동해서는 안 ? 한정자는 RegEx에서 0 또는 한 번 일치합니다. [] glob는 RegEx에서 똑같이 사용될 수 있습니다. 단, 그 뒤에는 필수 한정 기호가옵니다.

동등한 정규 표현식

글로브 정규 표현식
* .*
? .
[] []

문자열이 정규식과 일치하는지 확인

3.0

문자열이 정확히 8 자리 숫자로 구성되어 있는지 확인하십시오.

$ date=20150624
$ [[ $date =~ ^[0-9]{8}$ ]] && echo "yes" || echo "no"
yes
$ date=hello
$ [[ $date =~ ^[0-9]{8}$ ]] && echo "yes" || echo "no"
no

* glob

예비

$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar

별표 (*)는 아마도 가장 일반적으로 사용되는 glob 일 것입니다. 단순히 모든 문자열과 일치합니다.

$ echo *acy
macy stacy tracy

단일 *는 하위 폴더에있는 파일 및 폴더와 일치하지 않습니다.

$ echo *
emptyfolder folder macy stacy tracy
$ echo folder/*
folder/anotherfolder folder/subfolder

** glob

4.0

예비

$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -s globstar

Bash는 두 개의 인접한 별표를 단일 glob으로 해석 할 수 있습니다. globstar 옵션을 활성화하면 디렉토리 구조에서 더 깊은 곳에있는 폴더를 일치시키는 데 사용할 수 있습니다

echo **
emptyfolder folder folder/anotherfolder folder/anotherfolder/content folder/anotherfolder/content/deepfolder folder/anotherfolder/content/deepfolder/file folder/subfolder folder/subfolder/content folder/subfolder/content/deepfolder folder/subfolder/content/deepfolder/file macy stacy tracy

경로가 얼마나 깊은 지 상관없이 ** 는 경로 확장으로 생각할 수 있습니다. 이 예제는 중첩 된 deep 에 관계없이 deep 시작하는 모든 파일 또는 폴더를 찾습니다.

$ echo **/deep*
folder/anotherfolder/content/deepfolder folder/subfolder/content/deepfolder

? 글로브

예비

$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar

? 단순히 정확히 한 문자와 일치합니다.

$ echo ?acy
macy
$ echo ??acy
stacy tracy

[] 글롭

예비

$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar

특정 문자를 일치시킬 필요가 있으면 '[]'을 사용할 수 있습니다. '[]'안에있는 모든 문자는 정확히 한 번 일치합니다.

$ echo [m]acy
macy
$ echo [st][tr]acy
stacy tracy

그러나 [] 그물은 그저 다재다능합니다. 또한 부정적인 일치와 문자 및 문자 클래스의 일치하는 범위까지 허용합니다. 부정적인 일치는 ! 또는 ^ 다음의 첫 번째 문자로 [ . 우리는 stacy

$ echo [!t][^r]acy
stacy

여기서 bash는 t 시작하지 않는 파일과 두 번째 문자가 r 이 아닌 파일 만 일치 시키길 원하며 그 파일은 acy 끝납니다.

한 쌍의 문자를 하이픈 ( - )으로 구분하여 범위를 일치시킬 수 있습니다. 이 두 문자를 포함하는 두 문자 사이에있는 문자는 모두 일치합니다. 예를 들어, [rt][rst] 와 같습니다 [rst]

$ echo [r-t][r-t]acy
stacy tracy

문자 클래스는 [:class:] 로 매치 할 수 있습니다 [:class:] 예를 들어, 공백을 포함하는 파일을 일치시킵니다.

$ echo *[[:blank:]]*
file with space

일치하는 숨김 파일

예비

$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar

Bash 내장 옵션 인 dotglob를 사용하면 숨겨진 파일 및 폴더, 즉 a로 시작하는 파일 및 폴더를 일치시킬 수 있습니다 .

$ shopt -s dotglob
$ echo *
file with space folder .hiddenfile macy stacy tracy

대소 문자를 구분하지 않는 일치 검색

예비

$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar

nocaseglob 옵션을 설정하면 대문자와 소문자가 구별됩니다

$ echo M*
M*
$ shopt -s nocaseglob 
$ echo M*
macy

glob가 아무것도 일치하지 않는 경우의 동작

예비

$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar

glob가 아무것도 일치하지 않는 경우 결과는 nullglobfailglob 옵션에 의해 결정됩니다. 어느 쪽도 설정되어 있지 않으면 Bash는 일치하지 않으면 glob 자체를 반환합니다.

$ echo no*match
no*match

경우 nullglob 다음 활성화 아무것도 ( null ) 반환됩니다

$ shopt -s nullglob
$ echo no*match

$

failglob 가 활성화되면 오류 메시지가 반환됩니다.

$ shopt -s failglob
$ echo no*match
bash: no match: no*match
$

공지의 것을 failglob 옵션은 대체 nullglob 옵션을 경우 즉, nullglobfailglob 다음 두 세트입니다 - 아니 경기의 경우 - 오류가 반환됩니다.

확장 된 globbing

2.02

예비

$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar

Bash의 내장 extglob 옵션은 glob의 일치 기능을 확장 할 수 있습니다.

shopt -s extglob

다음 하위 패턴은 유효한 확장 글로브를 구성합니다.

  • ?(pattern-list) - 주어진 패턴의 0 번 또는 1 번 일치
  • *(pattern-list) - 주어진 패턴의 0 번 이상 일치
  • +(pattern-list) - 주어진 패턴의 하나 이상의 일치와 일치합니다
  • @(pattern-list) - 주어진 패턴 중 하나와 일치합니다.
  • !(pattern-list) - 주어진 패턴 중 하나를 제외한 모든 것을 일치시킵니다.

pattern-list| .

$ echo *([r-t])acy
stacy tracy

$ echo *([r-t]|m)acy
macy stacy tracy

$ echo ?([a-z])acy
macy

pattern-list 자체는 다른 중첩 된 확장 된 glob 일 수 있습니다. 위의 예에서 우리는 tracystacy*(rt) 와 일치시킬 수 있음을 보았습니다. 이 확장 된 glob 자체는 macy 와 일치시키기 위해 부정 된 확장 된 glob !(pattern-list) 내에서 사용될 수 있습니다 !(pattern-list)

$ echo !(*([r-t]))acy
macy

가능한 한 macy 만 남기는 문자 r , st 가 0 번 이상 나오지 않는 모든 문자와 일치합니다.

정규 표현식

pat='[^0-9]+([0-9]+)'
s='I am a string with some digits 1024'
[[ $s =~ $pat ]] # $pat must be unquoted
echo "${BASH_REMATCH[0]}"
echo "${BASH_REMATCH[1]}"

산출:

I am a string with some digits 1024
1024

정규식을 변수 ( $pat )에 대입하는 대신 다음과 같이 할 수 있습니다 :

[[ $s =~ [^0-9]+([0-9]+) ]]

설명

  • [[ $s =~ $pat ]] 구문은 정규 표현식을 수행합니다
  • 캡쳐 된 그룹, 즉 일치 결과는 BASH_REMATCH 라는 배열로 사용할 수 있습니다.
  • BASH_REMATCH 배열의 0 번째 인덱스는 전체 일치
  • BASH_REMATCH 배열에서 i 번째 인덱스 포착 기, i 번째 여기서 I = 1, 2, 3 ...

문자열에 대한 정규식 일치에서 캡처 된 그룹 가져 오기

a='I am a simple string with digits 1234'
pat='(.*) ([0-9]+)'
[[ "$a" =~ $pat ]]
echo "${BASH_REMATCH[0]}"
echo "${BASH_REMATCH[1]}"
echo "${BASH_REMATCH[2]}"

산출:

I am a simple string with digits 1234
I am a simple string with digits
1234


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow