bash에서 [[: space :]]의 의미는 무엇입니까?


23

방금 bash 스크립트를 발견했습니다. [[:space:]]bash 스크립트의 의미는 무엇입니까 ? 왜 이중 결장?

답변:


35

그것은 실제로 bash 매뉴얼에 있지만, 당신이 찾고있는 것을 아는 데 도움이되며, 당신이보고있는 것을 모른다면 도움 이되지 않습니다 . 검색 [[하면 [[ expression ]]조건식 섹션에 주의가 산만해질 것 입니다. 또한 검색 :space:하면 동일한 섹션에있는 두 가지 예에서 사용자 를 착륙시킵니다. 이 예에서 breadcrumb을 따를 수 있습니다.

예를 들어, 값에 0, 공백 문자, 0 또는 1 개의 'a'인스턴스를 포함하여 숫자로 구성된 문자 시퀀스가있는 경우 다음은 행 (쉘 변수 행에 저장 됨)과 일치합니다. '비':

[[ $line =~ [[:space:]]*?(a)b ]]

... [[:space:]]부분에서 "공백 문자"에 해당 하는 부분을 함께 모을 수 있지만, 문자가 전체 문자 클래스 가 아니라 문자 그대로의 공백 문자 라고 생각하면 용서받을 수 있습니다 .

온라인 bash 매뉴얼" space" 에서 문자열 (즉, 공백과 단어 "space")을 검색하면 ( 약 32 개의 일치 항목 만) 있습니다. 열 번째에 관해서는 여기에있을 것입니다 :

'['및 ']'내에서 문자 클래스는 구문 [: class :]을 사용하여 지정할 수 있습니다. 여기서 class는 POSIX 표준에 정의 된 다음 클래스 중 하나입니다.

alnum   alpha   ascii   blank   cntrl   digit   graph   lower
print   punct   space   upper   word    xdigit

문자 클래스는 해당 클래스에 속하는 모든 문자와 일치합니다.

그러면 "문자 클래스"라는 용어를 검색하고 찾을 수 있는 POSIX 표준으로 이동합니다.

wctype, wctype_l-문자 클래스를 정의합니다 .

wctype () [CX] [Option Start] 및 wctype_l () [Option End] 함수는 현재 로케일의 문자 유형 정보에 의해 정의 된 코딩 된 문자 세트의 규칙에 따라 wctype_t의 값을 결정해야합니다. [CX] [Option Start] 또는 로케일로 표시된 로케일에서 각각 [Option End] (카테고리 LC_CTYPE).

그런 다음 setlocale 링크 를 따라 가면 결국 Locale 섹션 에서 실제 답변을 얻을 수 있습니다 .

공간

공백 문자로 분류 할 문자를 정의하십시오. POSIX 로케일에는 정확하게 <space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>포함되어야합니다.

로케일 정의 파일에서 키워드 upper, lower, alpha, digit, graph 또는 xdigit에 지정된 문자는 지정하지 않아야합니다. <space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>휴대용 문자 세트 및 클래스 빈에 포함 된 문자는 자동으로이 클래스에 포함되어 있습니다.


1
LESS=+'/Within \[ and \],' man bash32 개의 next 명령 대신 수동으로 찾기가 더 쉽습니다 . :-).
이삭

5
@Isaac 나는 요점은 남자에게 낚시하는 법을 가르치는 것이라고 생각합니다. , 나는 몰랐다 less +"$cmd". 고마워.
JoL

3
실제로 저는 OP의 관점에서 대답했습니다. 그들은 외부 []가 내부와 무관 하다는 것을 받아들이지 않아서 용서받을 수있다 []. 나는 운이 좋은 추측이 필요했지만 답변이 무엇인지에 대해 너무 많이 몰라도 질문에서 답으로가는 길을 찾으려고 노력했습니다! :
Jeff Schaller

17

Bash만을위한 것이 아니라 POSIX 표기법의 일부입니다.

POSIX 란 무엇입니까?

POSIX 또는 "uniX 용 이식 가능 운영 체제 인터페이스"는 (UNIX) 운영 체제가 지원해야하는 일부 기능을 정의하는 표준 모음입니다. 이러한 표준 중 하나는 두 가지 맛의 정규 표현식을 정의합니다.

POSIX 브라켓 표현식

POSIX 대괄호 표현식은 특수한 종류의 문자 클래스입니다. POSIX 대괄호 표현식은 일반 문자 클래스처럼 문자 세트 중 하나의 문자를 찾습니다.

표준 POSIX

[[:alnum:]]   Alphanumeric characters
[[:alpha:]]   Alphabetic characters
[[:blank:]]   Space and tab
[[:cntrl:]]   Control characters
[[:digit:]]   Digits
[[:graph:]]   Visible characters (anything except spaces and control characters)
[[:lower:]]   Lowercase letters
[[:print:]]   Visible characters and spaces (anything except control characters)
[[:punct:]]   Punctuation (and symbols).
[[:space:]]   All whitespace characters, including line breaks
[[:upper:]]   Uppercase letters
[[:xdigit:]]  Hexadecimal digits

표준 없음

[[:ascii:]]   ASCII characters
[[:word:]]    Word characters (letters, numbers and underscores)

레거시 구문 (누군가 이것에 대한 참조를 찾을 수 있습니까?)

[[:<:]]       Start of Word 
[[:>:]]       End of Word

자세한 정보는 여기에서 찾을 수 있습니다 : wiki


1
[[:ascii:]][[:word:]]POSIX 클래스 (그들은 것 같다되지 않습니다 bash- 특정), 내가 찾을 수 [[:<:]]없고 [[:>:]]중 하나. 더 좋은 참고 문헌은 pubs.opengroup.org/onlinepubs/9699919799/basedefs/…
Kusalananda

1
그래, [[:ascii:]]그리고 [[:word:]]아무도 표준 POSIX의 클래스입니다. for [[:<:]][[:>:]], 참조를 찾을 수 없지만 동일 \b합니다. en.wikipedia.org/wiki/Regular_expression#Character_classes
니마

포스트 그레스의 사용 정의 [[:<:]]: 그리고 그 주장 이 확장이다,와 호환하지만, POSIX 1003.2로 지정하지
이삭

[[:<:]]FreeBSD에도 있으며 PostgreSQL과 같은 경고가 있습니다 : freebsd.org/cgi/…
ilkkachu

1
그리고 [[:ascii:]][[:word:]]패턴 매칭에 배쉬에서 작업 과정의,하지만 정규 표현식에서 (내 시스템에 적어도, 나는 배쉬 시스템의 정규식 라이브러리를 사용하여 생각). 바.
ilkkachu

9

정규 표현식 및 파일 이름 glob / shell 패턴에서 [...]구문은 괄호 안에 나열된 문자 중 하나와 일치합니다. 이러한 괄호 안에는 여러 개의 명명 된 표준 문자 문자 클래스를 사용할 수 있습니다. 그중 하나는 [:space:]공백 문자와 일치합니다 ( \sPerl 정규식 에서 와 같이 ). 예를 들어Bash 매뉴얼의 패턴 매칭

그래서, [[:space:]] 정규 표현식 또는 패턴 일치의 일부이며 공백과 일치합니다.

예를 들어 패턴 일치 (Bash 전용이 아닌 표준 쉘) :

case $var in 
    *[[:space:]]*) echo "'$var' contains whitespace";;
esac

또는 정규식 (Bash) :

if [[ $var =~ [[:space:]] ]]; then
    echo "'$var' contains whitespace"
fi

대괄호 표현식 [...]은 정규 표현식과 쉘 패턴에서 동일하게 작동 하지만 일반적으로 거의 동일 하지 않습니다 . ( case[[ string == pattern ]]사용 패턴 일치, [[ string =~ regex ]]사용의 정규 표현식에).

정규 표현식은 또한, 그들은 예에서 사용하고 특정 쉘되지 않습니다 awksed도 및 예에서 설명하는 리눅스 맨 페이지regex(7)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.