사용자가 sed를 사용하여 미리 정의 된 방식으로 파일을 원격으로 편집하는 데 사용할 수있는 패치를 만들고자하는데, 각 컴퓨터에서 수동으로 할 수는 있지만 시간이 오래 걸립니다. 다음과 같이
는내가 고민하고 선은 다음과 같습니다
host=[hostname]
port=[portnum]
ssh -t $host -p $port "cp ~/file1 ~/file1.bak ; sed -i \"s/fcn1('param1', $2)\n/fcn2('param2'):$zoom\n/g\" ~/file1"
이것은 파일 1의 백업을 만든 다음 파일의 라인을 편집합니다. 실제로 두 줄 이상을 편집하려고하지만이 줄은 문제를 보여줍니다. sed 명령에서 $ 기호가 사용되지 않으면 명령이 작동합니다.
나는 이러한 $ 기호를 이스케이프하는 여러 가지 방법을 시도했지만 작동하는 것으로는 보이지 않습니다. a를 사용할 수 있습니다. 와일드 카드는 찾기에 있지만 분명히 바꾸기 문자열에는 없습니다.
$ 2 확장을 피하기 위해 sed 명령에 작은 따옴표를 사용했지만 작은 따옴표는 이미 명령 내에서 사용되었습니다.
누구든지이 문제를 극복하는 방법에 대한 아이디어가 있습니까? 미리 제안 해 주셔서 감사합니다. 이뿐만 아니라 작동합니다
문자열에서 수행 된 모든 구문 분석 실행마다 이스케이프해야합니다. 나는 적어도 2 개의 실행을 생각하고있다 : 하나는 로컬 쉘을위한 쉘이고, 다른 하나는 원격 쉘을위한 쉘이다. 그래서 당신은 적어도'\\ $ 2', 아마도'\\\\ $ 2'를 필요로 할 것이다. –
@Marc B 고맙습니다. 저의 첫 번째 생각이었습니다.하지만 \\\ $ 2을 (를) 사용하여 [link] http://stackoverflow.com/questions/7990750/escape-single-quote를 발견했습니다. 0에서 4까지의 백 슬래시를 시도했지만 결국에는을 사용하기로 결정했습니다. 첫 번째 $는 문제를 단순화하고 두 번째 $에 집중하지만 두 번째 문자열에서 $로 바꿀 수는 없지만 최대 4 개의 백 슬래시로 이스케이프 처리를 시도했습니다. 1 또는 3은 "zoom : Undefined variable"오류를 반환합니다. $ zoom이 비어 있다고 가정하고 sed를 0 또는 2로 설정; 4는 빈 $ zoom 전에 백 슬래시를 생성합니다. 나는 $ zoom = '$ zoom'을 최대 네 개의 슬래시로 정의 해 보았습니다. 성공하지 못했습니다. – user1814618
해결책을 찾았습니다. $ 문자를 심는 쉘을 일시적으로 후퇴시킵니다. 즉, [$ zoom]을 [\ "\\ $ \"zoom]으로 바꾸십시오. 이것은 첫 번째 예제에도 적용되므로 와일드 카드가 필요하지 않습니다. – user1814618