sed 단어 경계, macOS

sed 단어 경계, macOS

저는 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

완벽하게 작동해야 합니다.

관련 정보