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 문서를 읽습니다 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 \;

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

관련 정보