교체하려고 해요핵심 단어{}
또는 같은 중괄호 로 표시하세요 {date}
. 이를 위해 정규식을 사용합니다.{name}
%@
{(.*?)\}
그래서 저는 다음과 같은 테스트 스크립트를 작성했습니다.
echo "hello { welcome } and { welcome} home {friend } {(friend)}" | sed "s; {\(.*\?\)\}; %@; g"
output: hello %@
hello %@ and %@ home %@ %@
그러나 나는 결과를 기대합니다 .
더 간단한 교체가 완벽하게 작동합니다.
echo "hello {} and {} home {} {}" | sed -e "s; {\}; %@; g"
output: hello %@ and %@ home %@ %@
이제 이 문제를 해결하는 방법에 대한 아이디어가 없습니다.
답변1
{\(.*\?\)\}
보세요, 이것은 .*
탐욕스럽기 때문에 위의 정규식은 첫 번째 줄 {
부터 마지막 줄까지 }
일치 합니다. 이는 출력을 정당화합니다.
또한 캡처 그룹에 대해 아무 작업도 수행하지 않으므로 \( \)
그룹을 제거할 수 있으며 마지막 중괄호를 이스케이프할 필요가 없습니다. 따라서 정규식은 다음과 같이 다시 작성할 수 있습니다 {.*\?}
.
Perl 정규식에 익숙하기 때문에 혼란스러울 수도 있습니다. Perl 정규 표현식은 .*?
탐욕스럽지 않지만 sed
이를 사용하는 대신 BRE 기본 정규 표현식을 사용합니다.
이제 원하는 출력을 얻으려면 다음을 실행하십시오.
{[^}]*}
이는 중괄호 안의 모든 값과 일치합니다. 즉, [^}]*
"문자가 아닌 모든 수 }
"를 의미합니다.
$ echo "hello { welcome } and { welcome} home {friend } {(friend)}" |
sed "s; {[^}]*}; %@; g"
hello %@ and %@ home %@ %@