저는 쉘 스크립팅을 배우고 있으며이를 위해 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.