我正在尝试使用 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上)(使用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:]]
.我转义了模式中的点以匹配文字点,而不是特殊.
模式通常匹配的“任何字符”。