次の行を含むファイルがあります。
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"