[bash] sed를 사용하여 이스케이프 기간이 있음에도 불구하고 잘못된 명령 코드.

현재 클라이언트에 대해 CVS를 사용해야하고 원격 리포지토리에 대해 주소가 변경되었습니다. 로컬 코드에서 원격 주소를 변경하는 유일한 방법은 재귀 검색 및 바꾸기입니다.

그러나 sed 명령을 사용하면 다음과 같이 작동합니다.

find ./ -type f -exec sed -i "s/192.168.20.1/new.domain.com/" {} \;

모든 파일에 대해 오류가 발생합니다.

sed: 1: ".//file/path ...": invalid command code .

sed match / replacement에서 기간을 벗어나려고했지만 아무것도 해결되지 않습니다.



답변

OS X를 사용하는 경우 sed 명령과 관련이 없습니다. 의 OSX 버전 sed에서 -i옵션은 extension인수를 예상 하므로 명령이 실제로 extension인수 로 구문 분석되고 파일 경로가 명령 코드로 해석됩니다.

가산 시도 -e명시 적으로 인수 및 제공 ''에 대한 인수로 -i:

find ./ -type f -exec sed -i '' -e "s/192.168.20.1/new.domain.com/" {} \;

참조 .


답변

에 인수를 제공하는 것을 잊었습니다 -i. 로 변경 -i하십시오 -i ''.

물론 이는 파일을 백업하지 않으려는 것을 의미합니다. 그렇지 않으면과 같이 선택한 확장 프로그램을 제공하십시오 -i .bak.


답변

OS X에서는 내장 된 sed가 적절 해지지 않습니다. 해결책은 다음과 같습니다.

brew install gnu-sed

그런 다음 sed 대신 gsed를 사용하면 예상대로 작동합니다.


답변

아마도 새 도메인에 /? 그렇다면, 이외의 구분 기호를 사용해보십시오 /에서 sed, 예를 들어 #, ,

find ./ -type f -exec sed -i 's#192.168.20.1#new.domain.com#' {} \;

s///변수 대체 또는 기타 예기치 않은 동작을 피하려면 큰 따옴표 대신 작은 따옴표 로 묶는 것이 좋습니다.


답변