저는 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
다음 위치에서 일치됩니다.
- 직전
c
. c
그리고 첫 번째 것 사이+
.- 마지막 것 바로 뒤에요
+
.
다음 명령은 원하는 결과를 제공합니다.
sed -i 's/\bhi\b/hotel/g' hi.txt
앞에는 단어 문자( ) 가 있고 뒤에는 단어 문자( ) 가 있으므로 단어가 this
일치하지 않습니다 . 그러나 주변 공백과 모두 단어가 아닌 문자이기 때문에 문자열은 의 두 번째 인스턴스에서 일치합니다 .h
t
i
s
This is hi.txt
hi
.
답변2
$ sed -e 's/\([^[:alnum:]_.-]\)hi\([^[:alnum:]_.-]\)/\1hotel\2/g' -e 's/^hi$/hotel/' <file
This is hi.txt.
hotel
hotel
hotel