sedを使用して二重引用符で囲まれた文字列を変数に置き換える方法は?

sedを使用して二重引用符で囲まれた文字列を変数に置き換える方法は?

次の行を含むファイルがあります。

  master_green_cloud_init_version = "v1.16/"

私のbashスクリプトには同様のパラメータがありますuserdata_version=v2.21

(ie)間の内容をどのように変更sedできますか?"""v1.16/"$userdata_version

v1.16変わり続けるのでハードコードできません。

答え1

を使用するには、sed説明するシナリオに対して次の入力ファイルが必要です。

master_green_cloud_init_version = "v1.16/"
master_blue_cloud_init_version = "v1.16/"

このスクリプト*

#!/bin/sh
  
userdata_version=v2.21
sed -i -e "/master_green_cloud_init_version/s/\".*\"/\"${userdata_version}\"/" input.txt

明らかにする

$ more input.txt
master_green_cloud_init_version = "v2.21"
master_blue_cloud_init_version = "v1.16/"
$

sedシェル変数を使用するには、式に二重引用符が必要です。こちらをご覧ください。回答到着sed スクリプトのシェル変数

その後、検索している二重引用符もエスケープする必要があります\"。開く二重引用符に1回、閉じる二重引用符に1回、このように2回実行する必要があります。

結果-iを。stdout


ノート:何らかの理由でバージョン文字列の末尾にスラッシュを保持したい場合は、\/次のようにエスケープされたスラッシュ()を使用できます。

#!/bin/sh

userdata_version=v2.21
sed  -e "/master_green_cloud_init_version/s/\".*\/\"/\"${userdata_version}\/\"/" input.txt

同じ入力ファイルに対して、次のように指定されます。

master_green_cloud_init_version = "v2.21/"
master_blue_cloud_init_version = "v1.16/"

*からLinux / Unixシェルでsedを使用してファイル内のテキストを見つけて置き換える方法:

sedを使用して単語を一致させ、検索して置換する方法

この例では、「love」という単語だけが見つかり、行の内容が特定の文字列(たとえばFOO)の場合は「sick」に置き換えられます。

sed -i -e '/FOO/s/love/sick/' input.txt 

また、見ることができますファイル内の文字列を置き換える方法は?

答え2

ファイルが作成された構成ファイルであると仮定TOML形式、その後利用できますtomlqパーサー値を変更し、シェル変数にuserdata_version新しい値を指定します。

tomlq -t --arg newversion "$userdata_version" \
        '.master_green_cloud_init_version |= $newversion' file.toml

これにより、最上位キーの値がmaster_green_cloud_init_version内部変数に割り当てられた値で更新されます。変更された文書は標準出力に書き込まれます(内部編集にはこのオプションを使用できます)。--arg$newversion--in-place

テスト:

$ cat file.toml
  master_green_cloud_init_version = "v1.16/"
$ userdata_version=v2.21
$ tomlq -t --arg newversion "$userdata_version" '.master_green_cloud_init_version |= $newversion' file.toml
master_green_cloud_init_version = "v2.21"

関連情報