정규식 예상치 못한 결과 바꾸기

정규식 예상치 못한 결과 바꾸기

교체하려고 해요핵심 단어{}또는 같은 중괄호 로 표시하세요 {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 %@ %@

관련 정보