sed - \b 단어 경계를 올바르게 사용하는 방법은 무엇입니까?

sed - \b 단어 경계를 올바르게 사용하는 방법은 무엇입니까?

단어 시작 부분의 따옴표를 바꾸고 싶습니다.

예를 들어:

$ echo "a 'line' a single ' after a  'keyword' with a few space's for a program"\
| sed "s/\b'/X/g"
a 'lineX a single ' after a  'keywordX with a few spaceXs for a program

하지만 보시다시피 교체 중입니다.말은 시작이 아닙니다.
단어의 시작 부분을 바꾸는 방법은 무엇입니까?

답변1

이는 '단어의 시작 부분을 대체합니다.

$ echo "a 'line' a single ' after a  'keyword' with a few space's for a program"| sed "s/'\b/X/g"
a Xline' a single ' after a  Xkeyword' with a few spaceXs for a program

여기에는 인간(컴퓨터는 아님)의 특징이 있습니다. 컴퓨터는 이것을 space's두 단어로 인식하고 '두 번째 단어의 시작 부분에 있기 때문에 the를 대체합니다.

논의하다

\b시작이나 끝 중 단어 경계를 표시하십시오. 이제 생각해 보세요 \b'. 이는 다음에 나오는 단어 경계와 일치합니다 '. '그렇기 때문에아니요즉, 단어의 끝이 '일치하려면 단어 앞에 와야 함을 의미합니다. \b단어의 시작 부분을 일치시키 려면 순서를 반대로 하십시오: '\b. 다시 말하지만, 단어 문자가 아니기 때문에 '뒤에 단어가 있어야만 일치합니다 '.

GNU sed와 같은 일부 sed는 \<단어 시작 부분 일치를 지원합니다. '더 이상 단어 문자가 아니므로 문제가 발생하기 때문에 이는 도움이 되지 않습니다 .

"공간"에 대해 어떻게 해야 할까요?

in 이 단어 끝에 나타나기 때문에 '바꾸고 싶지 않은 경우 다음을 사용하여 논리를 뒤집을 수 있습니다 .space's'\B

$ echo "a 'line' a single ' after a  'keyword' with a few space's for a program"| sed "s/\B'/X/g"
a Xline' a single X after a  Xkeyword' with a few space's for a program

\B성냥단어 경계가 아님. 따라서 공백이나 따옴표는 모두 단어 문자가 아니므로 \B'일치합니다 (공백-인용). is는 단어 경계이기 때문에 'at과 일치하지 않습니다 . 단어 문자이지만 그렇지 않습니다.space'e'e'

관련 정보