파일의 원래 줄:
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
사용하세요 .w
q
wq