한 줄에서 달러 기호와 일치 중괄호를 여러 번 제거합니다.

한 줄에서 달러 기호와 일치 중괄호를 여러 번 제거합니다.

파일의 원래 줄:

alarm_name = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"

${}, ${}, 없이 이 줄을 원합니다 ${}.

alarm_name = "var.environment-var.deployment-var.service_name-elb-healthyhosts"

다음과 같이 sed: 첫 번째 ${와 마지막을 제거합니다 }.

sed s'/\${\(.*\)}/\1/' filename

쌍으로 교정기를 제거하는 방법은 무엇입니까?

답변1

나는 사용할 것이다

sed -E 's/\$\{([^}]+)\}/\1/g'

데모:

$ line='alarm_name = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"'
$ sed -E 's/\$\{([^}]+)\}/\1/g' <<<"$line"
alarm_name = "var.environment-var.deployment-var.service_name-elb-healthyhosts"

답변2

이 입력에 필요한 것은 다음과 같습니다.

$ tr -d '${}' < file
alarm_name = "var.environment-var.deployment-var.service_name-elb-healthyhosts"

이것이 필요한 전부가 아닌 경우 더 대표적인 입력/출력 예제를 제공하도록 질문을 편집하지만 작동하지 않습니다.

답변3

문제는 .*초기 값과 최종 값 사이의 중간 값도 일치한다는 것입니다.${}${}

0개 이상의 비문자와 일치하는 로 대체된 것을 s/${\([^}]*\)}/\1/g제외하고는 현재 가지고 있는 것과 거의 동일한 이것을 사용할 수 있습니다 . 마지막으로 겹치지 않는 모든 일치 항목에 대해 교체를 반복합니다..*[^}]*}/g

그러나 이것은 중첩된 항목에는 작동하지 않습니다 ${...${...}...}.

또 다른 방법:

다음 줄에서 모두 ${및 를 제거합니다.}

sed -e 's/${//g' -e 's/}//g' file

위 명령의 장점은 두 개의 간단한 정규식이 일반적으로 하나의 복잡한 표현식보다 이해하고 유지 관리하기 더 쉽다는 것입니다. 또한 중첩된 문자열을 처리 ${}하지만 중첩된 문자열을 처리하는 기능이 부족합니다. ${을 사용하면 해당 또는 이 있는지 여부에 관계없이 모든 또는 을 }삭제합니다 .${}}${

문자열로 시작하는 줄에서만 이 작업을 수행하려면 다음을 수행하십시오 alarm_name =.

sed -e '/^alarm_name =/!b' -e 's/${//g' -e 's/}//g' file

b명령은 스크립트 끝으로 분기되며, 여기서는 행이 일치하지 않는 경우 교체를 우회하는 데 사용됩니다 ^alarm_name =.

시험:

$ cat file
alarm_name1 = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"
alarm_name = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"
alarm_name2 = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"
$ sed  -e '/^alarm_name =/!b' -e 's/${//g' -e 's/}//g' file
alarm_name1 = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"
alarm_name = "var.environment-var.deployment-var.service_name-elb-healthyhosts"
alarm_name2 = "${var.environment}-${var.deployment}-${var.service_name}-elb-healthyhosts"

질문에 태그를 지정했기 때문에, 편집기에서 수행하는 방법은 다음과 같습니다 ed.

g/^alarm_name =/ s/${//g\
s/}//g

즉, 일치하는 모든 행에 대해 ^alarm_name =두 번의 교체가 수행됩니다 .

또는 명령줄에서 스크립트 작업으로:

printf '%s\n' 'g/^alarm_name =/ s/${//g\' 's/}//g' ',p' 'Q' |
ed -s file

다음으로 수정된 파일의 내용은 종료하기 전에 표준 출력으로 출력됩니다 ,p. 및 /또는 변경 사항을 파일에 다시 쓰려면 Q사용하세요 .wqwq

관련 정보