sed 대체를 위한 bash 스크립트 인수에서 슬래시를 이스케이프 처리합니다.

sed 대체를 위한 bash 스크립트 인수에서 슬래시를 이스케이프 처리합니다.

이와 같은 슬래시가 포함된 bash 스크립트 매개변수를 문자열 대체를 수행하고 다른 파일을 다시 작성하는 함수 my_server/my_repo/my_image에 전달하고 싶습니다 .sed

다음과 같이 문자열을 설정할 때 슬래시를 이스케이프 처리하면 됩니다.

#!/usr/bin/bash

IMAGE_NAME="my_server\/my_repo\/my_image"
CURRENT_VERSION="1.0.0"
TARGET_VERSION="1.0.1"
TARGET_FILE="./my_deployment.yaml"

sed -i "s/$IMAGE_NAME:$CURRENT_VERSION/$IMAGE_NAME:TARGET_VERSION/" "$TARGET_FILE"

이것은 잘 작동하지만 이스케이프되거나 이스케이프되지 않은 동일한 문자열을 전달하면 작동하도록 할 수 없습니다. 나는 이것이 $IMAGE_NAME대체를 수행할 때 완전히 사라지는 while 명령 에서 변수가 이스케이프되지 않기 때문이라고 확신합니다 ./sedsed

나는 인수와 이스케이프의 다양한 조합을 시도했습니다.

> ./myscript.sh my_server/my_repo/my_image
> ./myscript.sh my_server\/my_repo\/my_image

매개변수를 다른 조합 에 지정할 때 매개변수를 변환하십시오 $IMAGE_NAME.

> IMAGE_NAME=$1
> IMAGE_NAME="$1"
> IMAGE_NAME=`echo $1 | sed 's/\//\\\//g'`

나는 이것이 bash가 문자열을 처리하고 이스케이프 처리하는 방법과 관련이 있다고 확신하지만 방법을 모르겠습니다.

그렇다면 다음과 같이 문자열을 매개변수로 전달하려면 어떻게 해야 합니까?

my_server/my_repo/my_image

변수에서 호출될 때 출력:

my_server\/my_repo\/my_image    

답변1

따옴표를 사용하거나 두 배로 늘려서 명령줄에서 백슬래시로부터 셸을 보호해야 합니다.

myscript.sh 
'my_server\/my_repo\/my_image'
..... Or
myscript.sh my_server\\/my_repo\\/my_image

관련 정보