sedを使用して、一部のファイルで一致するノードのバージョンを置き換えようとしています。
私が思いついた内容はこのようですが、交換後に特定の数字や文字を残して、完全一致を置き換えるのではなく、既存のテキストを置き換えるふりをします。
find . -type f -exec sed -i "s/nodejs\d*.x/nodejs18.x/" {} \;
現在、上記の方法はまったく機能しません
サンプル:
module "lambda_function" {
source = "git::ssh://[email protected]/pizzahutuk/infra-module-lambda?ref=v4.5.11"
runtime = "nodejs16.x"
}
上記の例は、nodejs16.x
次のように変更する必要があります。nodejs18.x
答え1
使用hclq
Matthew OlenikのHCLプロセッサ(mattolenik
Githubから)(たとえばを使用してインストールgo install github.com/mattolenik/hclq@latest
):
$ hclq set -i file module.lambda_function.runtime nodejs18.x
module "lambda_function" {
source = "git::ssh://[email protected]/pizzahutuk/infra-module-lambda?ref=v4.5.11"
runtime = "nodejs18.x"
}
その後、名前付きファイルからHCL文書を読み込みますfile
。runtime
キー値をモジュールにnodejs18.x
キーが表示される時間に設定します。lambda_function
を使用すると、--in-place
変更は内部で行われます。
ワイルドカードを使用してクエリパスを拡張できます。
$ hclq -i file set 'module.*.runtime' nodejs18.x
module "lambda_function" {
source = "git::ssh://[email protected]/pizzahutuk/infra-module-lambda?ref=v4.5.11"
runtime = "nodejs18.x"
}
set replace
以下を使用して特定の文字列のみを置き換えることもできます。
$ hclq -i file set replace 'module.*.runtime' nodejs16.x nodejs18.x
module "lambda_function" {
source = "git::ssh://[email protected]/pizzahutuk/infra-module-lambda?ref=v4.5.11"
runtime = "nodejs18.x"
}
上記のコマンドでは、runtime
キー値はnodejs18.x
元の値でない限り置き換えられませんnodejs16.x
。
これは、現在のディレクトリと次のディレクトリのすべてのファイルに適用できますfind
。
find . -type f -exec hclq -i {} --in-place set replace 'module.*.runtime' nodejs16.x nodejs18.x \;
sed
NodeJS文字列を置き換えるためにこれを使用するには、次のものを使用できます。
find . -type f -exec sed -i 's/nodejs[0-9]*\.x/nodejs18.x/' {} +
これは、表示されたオプションをsed
理解するソフトウェアがあると仮定します(内部編集用のFreeBSDとmacOS、ファイルをバックアップする必要はありません)。あなたの質問に使用したいのは、GNU正規表現でもサポートされているPerl互換正規表現モードです。移植性のために上記のように使用するか、特殊パターンが通常一致する「すべての文字」ではなくリテラル点と一致するようにパターンの点をエスケープしました。-i
-i ''
\d
[0-9]
[[:digit:]]
.