sed 명령이 완전한 단어만 검색하도록 하려면 어떻게 해야 합니까?

sed 명령이 완전한 단어만 검색하도록 하려면 어떻게 해야 합니까?

저는 Linux를 처음 접했고 최근에 명령줄을 실험하기 시작했습니다. 파일을 만들고 이름을 "hi.txt"로 지정하기로 결정했습니다. 파일 내용은 다음과 같습니다.

This is hi.txt.
hi 
hi
hi

이 명령을 사용하여 sed -i 's/hi/hotel/g' hi.txt문서의 모든 "hi"를 "hotel"로 변경했습니다. 출력은 다음과 같습니다.

Thotels is hotel.txt
hotel
hotel
hotel 

보시다시피, "hi" 단어 "This"도 변경되었습니다. 이런 일이 발생하지 않도록 하는 방법이 있나요?

답변1

s///명령은 "search" 매개변수가 다음과 같을 것으로 예상합니다.정규식. 대부분의 버전은 단어가 비단어와 일치하거나 단어 가장자리 경계에서 너비가 0인 일치를 sed지원해야 합니다 . \b이 경우 "단어"는 문자, 숫자 또는 밑줄( ) 문자로 정의됩니다 _. 예를 들어, 문자열이 c++파일의 자체 줄에 있다고 가정하면 \b다음 위치에서 일치됩니다.

  1. 직전 c.
  2. c그리고 첫 번째 것 사이 +.
  3. 마지막 것 바로 뒤에요 +.

다음 명령은 원하는 결과를 제공합니다.

sed -i 's/\bhi\b/hotel/g' hi.txt

앞에는 단어 문자( ) 가 있고 뒤에는 단어 문자( ) 가 있으므로 단어가 this일치하지 않습니다 . 그러나 주변 공백과 모두 단어가 아닌 문자이기 때문에 문자열은 의 두 번째 인스턴스에서 일치합니다 .htisThis is hi.txthi.

답변2

$ sed -e 's/\([^[:alnum:]_.-]\)hi\([^[:alnum:]_.-]\)/\1hotel\2/g' -e 's/^hi$/hotel/' <file
This is hi.txt.
hotel
hotel
hotel

관련 정보