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:]]
.