원격 서버에 있는 파일의 문자열을 바꾸려고 합니다.
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 문서 전체가 작은따옴표로 묶여 있음을 의미합니다. 읽기가 더 쉽죠?