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


187

현재 클라이언트에 대해 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에서 기간을 벗어나려고했지만 아무것도 해결되지 않습니다.

답변:


476

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/" {} \;

참조 .


41
차이를 찾은 것처럼 10 분을 보낸 경우 -e 옵션
acheron55

9
이 질문RE error: illegal byte sequence 은 MacOS의 답변 입니다.
JonasVautherin

11
나는 빈 문자열 ''을 -i의 매개 변수로 사용했으며 다음과 같이 작동했습니다.sed -i '' 's/blah/xx/g'
Pierre Houston

25
나를 위해, 추가 -e한 후 -i만든 sed이 방법으로 백업 내 모든 파일을 "에 foo.txt"-> "foo.txt의-전자". 분명히 내가 원하는 것은 오히려 -i ''변경된 파일을 백업하지 않는 것입니다.
mdup

3
나에게도 같은 문제입니다. 이 -i -e과 결합이 find끝나는 많은 많은 파일에 결과 -e-e-e-e-e-e-e.
aspyct

39

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

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


6

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

brew install gnu-sed

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


1
이 답변에 감사드립니다. Linux와 Mac 모두에서 일하면서 밀접하게 관련된 두 가지의 차이점을 배우는 것보다 익숙한 도구에 대한 액세스를 선호합니다.
Stephen Shank

3

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.