저는 쉘 스크립팅을 배우고 있으며 이를 위해 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/'
모든 항목을 바꿀 수 있습니다 .the
this
the
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.