원격 SSH 서버에서 강제 변수 확장

원격 SSH 서버에서 강제 변수 확장

원격 서버에 있는 파일의 문자열을 바꾸려고 합니다.

ssh $login "
replacement=\`find . -name file\`;
sed -i -e 's/contact/\$replacement/g' path/file;
"

하지만 sed에서 사용하는 $replacement 변수의 내용을 가져올 수 없습니다. 위의 예는 $replacement내 파일에 인쇄됩니다. 나도 시도했다

sed -i -e 's/contact/\"\$replacement\"/g' path/file;

하지만 그냥 인쇄된다"$replacement"

올바른 구문은 무엇입니까?

답변1

문제는 $replacement가 작은따옴표 사이에서 확장되지 않는다는 것입니다.

이 경우 sed -i -e "s/contact/$replacement/g" path/file;작동해야 합니다 .

아니면 이거:

sed -i -e 's/nothing/'$replacement'/g' path/file;

예:

$ echo "There's nothing there." > file 
$ cat file 
There's nothing there.
$ replacement=something 
$ sed -i -e 's/nothing/'$replacement'/g' file;
$ cat file
There's something there.

아래 Kusalananda의 의견에 대한 응답: 대체 경로(경로)에 슬래시가 포함된 경우 sed와 함께 사용하기 전에 사전 처리해야 합니다.

replacement=$(sed 's@\/@\\\/@g' <<< "$replacement")

답변2

인용 지옥에 있는 동안 여기에서 문서를 살펴보는 것이 좋습니다.

ssh "$login" <<'END_REMOTE'
    replacement=$(find . -name file)
    sed -i -e 's/contact/$replacement/g' path/file
END_REMOTE

here 문서의 시작 키워드가 인용되어 있습니다. 이는 here 문서 전체가 작은따옴표로 묶여 있음을 의미합니다. 읽기가 더 쉽죠?

관련 정보