使用 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 处理器mattolenik在Github上)(使用eg安装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了解-i所示选项的软件(FreeBSD 和 macOS 用于-i ''就地编辑,无需备份文件)。您\d在问题中尝试使用的是 Perl 兼容的正则表达式模式,GNU 正则表达式也支持该模式。为了可移植性,请使用[0-9]如上所示,或[[:digit:]].我转义了模式中的点以匹配文字点,而不是特殊.模式通常匹配的“任何字符”。

相关内容