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

おすすめ記事