grep 캐럿이 효과가 없는 것 같습니다.

grep 캐럿이 효과가 없는 것 같습니다.

나는 캐럿이 "줄의 시작" 확장된 POSIX 정규식을 사용합니다.

그런데 사용하다 보면 grep예상치 못한 동작이 발생합니다.

나는 사용하고있다암소 비슷한 일종의 영양 grep 2.5.4존재하다우분투 10.04 루시드링스.

나는 문장을 반향한다'안녕하세요' 그런 다음 grep검색어에 파이프를 연결합니다.0개 이상의 공백 문자 뒤에 문자가 옵니다.시간":

echo ' hello' | grep -E '[:space:]*h'
hello

grep괜찮아요.

패턴만 일치시키고 싶다는 것을 나타내기 위해 캐럿을 추가하면"0개 이상의 공백 문자 뒤에 문자가 옵니다.시간문자열의 시작 부분에":

echo ' hello' | grep -E '^[:space:]*h'

일치하는 항목이 없습니다. 문자열이 다음으로 시작하기 때문에 일치하길 원합니다.공백이어서시간.

이 캐럿이 일치를 방지하는 이유는 무엇입니까?

답변1

다른 괄호 쌍 안에서 사용해야 하는 공간을 찾으려면 [:space:]다음과 같습니다 [[:space:]]. 당신은 표현하고 싶을 수도 있습니다grep -E '^[[:space:]]*h'

현재 실패 이유를 설명하십시오.

현재 상태로는 , , , , 및 와 같은 문자를 찾기 위해 문자 클래스가 포함되어 있으며, 여기서는 [:space:]*h0 을 포함하여 여러 번 발생하고 뒤에 가옵니다 . 이것은 문자열과 잘 일치하지만 를 실행하면 공백이 아닌 과만 일치하는 것을 볼 수 있습니다 .:spacehgrep -oh

처음에 캐럿을 추가하면 해당 문자 중 하나가 h문자열의 시작 부분에 있어야 일치하지만 문자열의 시작 부분에 그 문자 중 하나도 없으므로 일치하지 않습니다.

답변2

[:space:]대괄호 표현식 내에서만 발생한다고 가정하는 것 같습니다 (*로 강조 표시된 일치).

echo 'hello' | grep -E '^[:space:]*h'
*h*ello
echo 'hello' | grep -E '[^[:space:]]*h'
*h*ello
echo ' hello' | grep -E '^[[:space:]]*h'
* h*ello

다음 스니펫 man grep(내 하이라이트)이 이에 대해 설명합니다.

마지막으로 특정 명명된 문자 클래스가 미리 정의되어 있습니다.괄호 안의 표현[...] 이 클래스 이름의 대괄호는 기호 이름의 일부이며괄호 외에 다음도 포함해야 합니다.대괄호 표현을 구분합니다.

관련 정보