sed を使用して特定のファイルでノードバージョンを検索および置換する

sed を使用して特定のファイルでノードバージョンを検索および置換する

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

使用hclqMatthew OlenikのHCLプロセッサmattolenikGithubから)(たとえばを使用してインストール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文書を読み込みますfileruntimeキー値をモジュールに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 \;

sedNodeJS文字列を置き換えるためにこれを使用するには、次のものを使用できます。

find . -type f -exec sed -i 's/nodejs[0-9]*\.x/nodejs18.x/' {} +

これは、表示されたオプションをsed理解するソフトウェアがあると仮定します(内部編集用のFreeBSDとmacOS、ファイルをバックアップする必要はありません)。あなたの質問に使用したいのは、GNU正規表現でもサポートされているPerl互換正規表現モードです。移植性のために上記のように使用するか、特殊パターンが通常一致する「すべての文字」ではなくリテラル点と一致するようにパターンの点をエスケープしました。-i-i ''\d[0-9][[:digit:]].

関連情報