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


12

저는 쉘 스크립팅을 배우고 있으며이를 위해 HackerRank를 사용하고 있습니다. sed같은 사이트에 관한 질문이 있습니다 : 'Sed'command # 1 :

주어진 입력 파일의 각 줄에 대해 단어 'the'의 첫 번째 항목을 'this'로 변환하십시오. 검색 및 변환은 대소 문자를 구분해야합니다.

우선 시도한 것은

sed 's/the/this/'

그러나 그 샘플 테스트 사례에서 실패했습니다. 그런 다음 시도했습니다

sed 's/the /this /'

그리고 효과가있었습니다. 따라서 공백이 어떤 차이를 만들 었는지 의문이 생깁니다. 여기에 뭔가 빠졌습니까?


첫 번째 버전도 "작동 한"것으로 가정하지만 예상 한대로는 아닙니다. 문자 시퀀스 "the"의 첫 번째 항목을 대체해야하지만 "" "라는 단어의 첫 번째 항목을 보았을 것입니다.
Dubu

글쎄요, 이론 상으로는 실제로는 아닙니다.
Rolf

답변:


7

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

나는 그것을 놓쳤다. "the"를 문자열로 가져와야했습니다. 하위 문자열이 아닙니다.
JHA

1
@ JHA : 그것은 또한 라인의 끝에서 중요합니다. 예를 들어 "the"라는 단어는 줄 끝에 줄 바꿈이있는 파일의 일부로 줄 끝에 나타날 수 있지만 여전히 단락 중간에 있으므로 영어 문장에서 일반 단어입니다. the( |$)확장 정규식이 작동하면 작업에 더 가까울 수 있습니다. 어쨌든 IDK는 "문자열"과 하위 문자열을 의미합니다. 두 경우 모두 전체 줄의 하위 문자열이며 테스트 사례는 "the "실패한 사례를 감지하기에 충분하지 않습니다. Kusalanada의 답변이 훨씬 낫습니다. 수락하는 것이 좋습니다.
Peter Cordes

20

값이 싸고 오류가 발생하기 쉬운 단어 매칭 방법입니다 .

참고로 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/'

7

sed는 정규식으로 작동합니다. sed 's/the /this /'당신을 사용 하면 the일치하는 패턴의 일부 뒤에 공백을 만듭니다 .

사용 sed 's/the/this/'당신의 모든 항목을 대체 the하여 this공간 후에 존재하는 경우에 상관없이 the.

HackerRank 연습에서는 결과를 논리적으로 대체하기 때문에 결과는 동일합니다. 대명사 만 기본적으로 뒤에 공백 (문법 규칙)이 오도록 대체합니다.

예를 들어 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.

답변 감사합니다. 감사합니다 :)
JHA

"모든 발생을 교체합니다" 명확하게하기 위해 : g교체 후 텍스트가 없으면 첫 번째 발생 만 교체합니다 .
Dubu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.