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

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

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

우선 시도한 것은

sed 's/the/this/'

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

sed 's/the /this /'

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



답변

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이 단어가 일치하지 않는 후 공간이 thereby너무 뒤에 공백과 일치하는 the단어의 시작에 해당 문자열을 일치 방지 할 수 있습니다. 그러나, 그것은 여전히 않습니다 일치 bathe(뒤에 공백이있는 경우), 그리고 않습니다 하지 일치하는 the행의 끝에서.

단어를 the올바르게 (또는 다른 단어로) 일치 시키려면 단어 의 시작 부분이나 끝 부분에서 또는 단어와 같이 다른 단어가 아닌 문자가 옆에있는 경우 단어 주위에 공백을 사용하면 안됩니다. 문장 부호 또는 탭 문자 (예 :

대신 너비가 0 인 단어 경계 패턴을 사용하십시오.

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

\<와는 \>즉 사이의 공간, 이전과 단어 뒤에 경계를 일치하는 단어 문자단어가 아닌 문자 . 단어 문자는 일반적으로 모든 문자 일치 [[:alnum:]_](또는 [A-Za-z0-9_]POSIX 로캘)입니다.

GNU sed를 사용하면 및 \b대신에 사용할 수도 있습니다 .\<\>

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


답변

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.


답변