sed의 앵커 문자 [^]

sed의 앵커 문자 [^]

부정적인 표현을 사용할 때 sed가 [^ ]앵커 문자를 \b실제 문자로 취급하는 이유는 무엇입니까 \B? 예를 들어, 다음 표현식이 동일한 결과를 생성할 것으로 예상할 수 있지만 그렇지 않습니다.

$ echo 'apple pear melon banana cherry papaya' | sed 's/[^\b]a[^\b]/u/g'
apple pu melon baua cherry uaya
$ echo 'apple pear melon banana cherry papaya' | sed 's/\Ba\B/u/g'
apple peur melon bununa cherry pupuya

그렇지 않다면 \B어떻게 그것을 부정할 수 있겠습니까 \b?

답변1

\b또는\B 문자도 아닙니다 . 둘 다 일치하는 너비가 0인 패턴입니다.~ 사이수치.

패턴 \b은 단어 경계, 즉 "단어 문자"인 문자와 "단어 문자"가 아닌 문자 사이에서 일치합니다.

\B패턴은 단어가 아닌 경계, 즉 "단어 문자"이거나 아닌 두 문자 사이에서 일치합니다.

패턴 [^\b]매칭캐릭터. 그렇기 때문에 pear로 변환하려면 ( 및 주변 문자)를 pu바꾸십시오 .eara

GNU 의 경우 sedan 또는 a가 아닌 문자와 일치합니다 [^\b].\b

\B내가 아는 문자 클래스를 사용하는 대신 문자 클래스를 사용할 방법이 없습니다 .

GNU 지원 \b및 모드. GNU와 BSD 모두 단어의 시작과 끝에서 명시적 일치를 위한 및 를 갖고 있으며 BSD는 POSIX 모드 및 (GNU는 아님)도 지원합니다. POSIX 모드는 무효화될 수 없습니다(효과가 없음).\Bsedsedsed\<\>sed[[:<:]][[:>:]]sed[^[:>:]]

하나 얻으려면비슷한Effect를 사용하는 대신 \B다음과 같은 것을 사용할 수 있습니다.

$ echo 'apple pear melon banana cherry papaya' | sed 's/\([[:alnum:]]\)a\([[:alnum:]]\)/\1u\2/g'
apple peur melon bunana cherry pupaya

즉, 양쪽의 영숫자 문자를 일치시킨 a다음 대체 문자에 두 개의 옆 문자를 포함시킵니다. 대체는 겹치지 않는 일치 내에서만 발생하므로 a여러 개의 연속된 '(또는 다른 모든 위치의 ')을 포함하는 문자열에서 '를 올바르게 대체하지 않습니다. 이에 나타나지 않는 방법을 확인하십시오.aabananabununa

이 문제를 해결하려면 sed프로그램에 루프를 도입할 수 있습니다.

sed -e :top -e 's/\([[:alnum:]]\)a\([[:alnum:]]\)/\1u\2/g' -e ttop

이는 모든 겹치는 패턴 일치가 처리될 때까지 입력 라인에서 필요한 만큼 많은 대체를 수행합니다.

관련 정보