후행 공백이 있거나 없는 단어 일치의 차이점은 무엇입니까?

후행 공백이 있거나 없는 단어 일치의 차이점은 무엇입니까?

저는 쉘 스크립팅을 배우고 있으며 이를 위해 HackerRank를 사용하고 있습니다. sed동일한 웹 사이트에 관련 질문이 있습니다."Sed" 명령 #1:

주어진 입력 파일의 각 줄에 대해 "the"라는 단어가 처음 나타나는 것을 "this"로 변환합니다. 검색 및 변환은 엄격하게 대소문자를 구분해야 합니다.

먼저 시도해봤는데,

sed 's/the/this/'

하지만 이 예제 테스트 사례에서는 실패합니다. 그런 다음 시도했습니다.

sed 's/the /this /'

효과가 있었습니다. 그렇다면 문제는 공백이 어떤 차이를 만드는가 하는 것입니다. 여기서 뭔가 빠졌나요?

답변1

이는 저렴하고 오류가 발생하기 쉬운 접근 방식입니다.단어 일치.

후행 공백 은 the단어와 일치하지 않으므로 thereby후행 공백과 일치하면 the단어 시작 부분의 문자열과 일치하지 않습니다. 그러나 여전히하다bathe뒤에 공백이 있으면 일치 하며,아니요the줄의 끝 과 일치합니다 .

단어 the(또는 다른 단어)를 올바르게 일치시키려면 단어 주위에 공백을 사용하면 안 됩니다. 이렇게 하면 줄의 시작이나 끝에서 일치하지 않거나 단어가 아닌 다른 문자가 옆에 있는 경우 일치하지 않게 됩니다. , 예를 들어 구두점이나 탭 문자 등입니다.

대신 너비가 0인 단어 경계 모드를 사용하세요.

sed 's/\<the\>/this/'

단어 앞과 뒤의 경계, 즉 단어 사이의 공백을 \<일치시킵니다 .\>단어 문자그리고단어가 아닌 문자. 단어 문자는 일반적으로 일치하는 문자 [[:alnum:]_](또는 [A-Za-z0-9_]POSIX 로케일)입니다.

GNU의 경우 및 대신 sed다음을 사용할 수도 있습니다 .\b\<\>

sed 's/\bthe\b/this/'

답변2

차이점 the은 입력 텍스트 뒤에 공백이 있는지 여부입니다.
예를 들어:

공백 없는 문장, 교체 없이:

$ echo 'theman' | sed 's/the /this /'
theman

공백이 있는 문장, 예상대로 작동합니다.

$ echo 'the man' | sed 's/the /this /'
this man

다른 공백 문자가 포함된 문장, 대체가 발생하지 않습니다.

$ echo -e 'the\tman' | sed 's/the /this /'
the     man

답변3

sed는 정규식을 사용합니다. 사용하려면 sed 's/the /this /'일치하는 패턴의 일부 뒤에 공백을 남겨두기만 하면 됩니다.the

를 사용하면 다음 공백 유무 에 관계없이 sed 's/the/this/'모든 항목을 바꿀 수 있습니다 .thethisthe

HackerRank 연습에서는 the를 this로 바꾸는 것이 논리적이기 때문에 결과는 동일합니다. 기본적으로 공백이 뒤에 오는 대명사만 바꾸는 것입니다(문법 규칙).

the예를 들어 다음과 같은 단어를 대문자로 사용해 보면 차이를 확인할 수 있습니다 the theater.

echo 'the theater' |sed 's/the /THE /g'
THE theater                              
#theater is ignored since the is not followed by space

echo 'the theater' |sed 's/the/THE/g'
THE THEater
#both the are capitalized.

관련 정보