저는 macOS를 사용하고 있으며 다음 sed
명령을 사용하여 주어진 단어를 찾아 다른 단어로 바꾸려고 하는데 아무런 변화가 없습니다. 문제가 무엇입니까?
sed 's/\<cat\>/dog/g' tt.txt
답변1
sed
[[:<:]]
대신 사용 \<
하고 macOS에서 [[:>:]]
바꾸십시오 \>
. 또한 macOS 구현은 단어 경계 모드를 sed
지원하지 않습니다 . macOS 설명서에 언급되어 \b
있지만sed(1)
re_format(7)
하다\<
, \>
및 을 언급합니다 \b
.
파일 자체는 변경되지 않습니다.
sed 's/[[:<:]]cat[[:>:]]/dog/g' tt.txt
일어나는 유일한 일은 sed
파일을 읽고 각 입력 줄에 표현식을 적용하는 것입니다. 그런 다음 변환된 데이터를 표준 출력에 씁니다.
출력을 새 파일에 저장하려면 다음을 사용하십시오.
sed 's/[[:<:]]cat[[:>:]]/dog/g' tt.txt >tt.txt-new
그런 다음 원본 파일을 새 데이터로 바꿀 수 있습니다.
sed 's/[[:<:]]cat[[:>:]]/dog/g' tt.txt >tt.txt-new && mv tt.txt-new tt.txt
macOS에서는 다음 명령을 사용하여 내부 변환을 수행할 수도 있습니다.
sed -i '' 's/[[:<:]]cat[[:>:]]/dog/g' tt.txt
설명서에 다음과 같이 나와 있지만
디스크 공간 부족과 같은 상황에서 콘텐츠가 손상되거나 부분적으로 발생할 위험이 있으므로 파일을 내부에서 편집할 때 길이가 0인 확장자를 제공하지 않는 것이 좋습니다.
답변2
텍스트의 순서가 정확하다면 \<cat\>
교체해야 합니다. 하지만 내 생각엔 <cat>
이것만 시도하는 것 같아요:
sed 's/<cat>/dog/g' tt.txt
작은따옴표는 그 사이의 문자가 해석되는 것을 방지합니다.
답변3
-i
파일을 편집하려면 sed 뒤에 추가 해야 합니다 . 예를 들면 다음과 같습니다.
sed -i 's/cat/dog/g' tt.txt
완벽하게 작동해야 합니다.