부정적인 표현을 사용할 때 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
바꾸십시오 .ear
a
GNU 의 경우 sed
an 또는 a가 아닌 문자와 일치합니다 [^\b]
.\
b
\B
내가 아는 문자 클래스를 사용하는 대신 문자 클래스를 사용할 방법이 없습니다 .
GNU 지원 \b
및 모드. GNU와 BSD 모두 단어의 시작과 끝에서 명시적 일치를 위한 및 를 갖고 있으며 BSD는 POSIX 모드 및 (GNU는 아님)도 지원합니다. POSIX 모드는 무효화될 수 없습니다(효과가 없음).\B
sed
sed
sed
\<
\>
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
여러 개의 연속된 '(또는 다른 모든 위치의 ')을 포함하는 문자열에서 '를 올바르게 대체하지 않습니다. 이에 나타나지 않는 방법을 확인하십시오.a
a
banana
bununa
이 문제를 해결하려면 sed
프로그램에 루프를 도입할 수 있습니다.
sed -e :top -e 's/\([[:alnum:]]\)a\([[:alnum:]]\)/\1u\2/g' -e ttop
이는 모든 겹치는 패턴 일치가 처리될 때까지 입력 라인에서 필요한 만큼 많은 대체를 수행합니다.