sed를 사용하여 큰따옴표로 묶인 문자열을 변수로 바꾸는 방법은 무엇입니까?

sed를 사용하여 큰따옴표로 묶인 문자열을 변수로 바꾸는 방법은 무엇입니까?

다음 줄이 포함된 파일이 있습니다.

  master_green_cloud_init_version = "v1.16/"

내 bash 스크립트에는 비슷한 매개변수가 있습니다 userdata_version=v2.21.

(ie ) 사이의 내용을 어떻게 바꿀 sed수 있나요 ?"""v1.16/"$userdata_version

v1.16계속 바뀌기 때문에 하드코딩할 수 없습니다 .

답변1

을 사용하려면 sed설명하는 시나리오에 대해 다음 입력 파일이 있어야 합니다.

master_green_cloud_init_version = "v1.16/"
master_blue_cloud_init_version = "v1.16/"

이 스크립트 *

#!/bin/sh
  
userdata_version=v2.21
sed -i -e "/master_green_cloud_init_version/s/\".*\"/\"${userdata_version}\"/" input.txt

밝혀지다

$ more input.txt
master_green_cloud_init_version = "v2.21"
master_blue_cloud_init_version = "v1.16/"
$

sed쉘 변수를 사용하려면 표현식에 큰따옴표가 필요합니다 . 이 내용을 참조하세요.답변도착하다sed 스크립트의 쉘 변수.

그런 다음 검색 중인 큰따옴표도 이스케이프 처리해야 합니다 \". 여는 큰따옴표에 한 번, 닫는 큰따옴표에 한 번, 이렇게 두 번 수행해야 합니다.

결과 -i를 .stdout


노트: 어떤 이유로 버전 문자열 끝에 슬래시를 유지하려는 경우 \/다음과 같이 이스케이프된 슬래시( )를 사용할 수 있습니다.

#!/bin/sh

userdata_version=v2.21
sed  -e "/master_green_cloud_init_version/s/\".*\/\"/\"${userdata_version}\/\"/" input.txt

동일한 입력 파일에 대해 다음과 같이 지정됩니다.

master_green_cloud_init_version = "v2.21/"
master_blue_cloud_init_version = "v1.16/"

* 에서Linux/Unix 셸에서 sed를 사용하여 파일에서 텍스트를 찾고 바꾸는 방법:

sed를 사용하여 단어를 일치시키고 찾기 및 바꾸기를 수행하는 방법

이 예에서는 "love"라는 단어만 발견되며 줄 내용이 특정 문자열(예: FOO)인 경우 "sick"으로 대체됩니다.

sed -i -e '/FOO/s/love/sick/' input.txt 

당신은 또한 볼 수 있습니다파일에서 문자열을 바꾸는 방법은 무엇입니까?

답변2

파일이 작성된 구성 파일이라고 가정TOML 형식, 그런 다음 사용할 수 있습니다tomlq파서값을 변경하고 쉘 변수에 userdata_version새 값을 지정하십시오.

tomlq -t --arg newversion "$userdata_version" \
        '.master_green_cloud_init_version |= $newversion' file.toml

이렇게 하면 최상위 키 값이 master_green_cloud_init_version내부 변수에 할당된 값으로 업데이트됩니다. 수정된 문서는 표준 출력에 기록됩니다(내부 편집에 이 옵션을 사용할 수 있음).--arg$newversion--in-place

시험:

$ cat file.toml
  master_green_cloud_init_version = "v1.16/"
$ userdata_version=v2.21
$ tomlq -t --arg newversion "$userdata_version" '.master_green_cloud_init_version |= $newversion' file.toml
master_green_cloud_init_version = "v2.21"

관련 정보