GNU와 BSD에서 sed 명령이 작동하도록 하려면 어떻게 해야 합니까?

GNU와 BSD에서 sed 명령이 작동하도록 하려면 어떻게 해야 합니까?

~/.ssh/config에 콘텐츠 블록이 있습니다. "# BEGIN AUTO GENERATED CONTENT" 줄로 시작하고 "# END AUTO GENERATED CONTENT" 줄로 끝납니다.

이 두 줄 사이의 내용을 바꾸는 명령이 있습니다. 내용은 "config"라는 파일에서 읽혀집니다.

sed -i -ne '/# BEGIN AUTO GENERATED CONTENT/ {p; r config' -e ':a; n; /# END AUTO GENERATED CONTENT/ {p; b}; ba}; p' ~/.ssh/config

우분투에서는 잘 작동하지만 bsd sed를 사용하는 Mac에서는 작동하지 않습니다. 다음과 같은 오류 메시지가 나타납니다.

sed: 1: "/# BEGIN AUTO GENERATED ...": unexpected EOF (pending }'s)

bsd에서 작동하려면 이 명령을 수정해야 합니다. 맥에서는 gsed를 사용하지 마세요

답변1

첫째, Mac을 사용하고 있으므로 개별 -i옵션이 작동하지 않습니다. 귀하의 경우 null인 경우 값을 제공해야 합니다.

둘째, 스위치가 이미 적용되어 있으므로 상황에 따라 p;b쌍을 변경할 수 있습니다. 이전 버전에서는 분기 명령이 닫는 중괄호와 잘 작동하지 않습니다.p;d-nbseds

$ sed -i '' -ne '/# BEGIN AUTO GENERATED CONTENT/{' -e 'p;r config' -e ':a;n' -e '/# END AUTO GENERATED CONTENT/{' -e 'p;d' -e '}' -e 'ba' -e '}' -e 'p' ~/.ssh/config

이것이 사용하고 버리는 것이 아니라면 파일에 다시 작성하고 다음과 같이 호출하는 것이 좋습니다.

$ sed -i '' -nf ./code ~/.ssh/config

$ cat ./code
   /# BEGIN AUTO GENERATED CONTENT/{
      p
      r config
      :loop
         n
         /# END AUTO GENERATED CONTENT/{
            p
            d
         }
      bloop
   }
   p

관련 정보