중괄호 이스케이프를 포함하는 구문 분석 중괄호 쌍

중괄호 이스케이프를 포함하는 구문 분석 중괄호 쌍

일부 텍스트가 있는데 그 중 일부는 으로 표시되어 있습니다 _{...}. 닫는 밑줄과 중괄호 쌍을 별표로 바꿔야 합니다. 예를 들어, Hello _{world} _{foo}가 됩니다 Hello *world* *foo*.

sed -r 's/_\{([^}]+)}/*\1*/g'이는 중괄호 이스케이프를 포함할 수 있다는 사실이 아니었다면 쉽게 해결할 수 있는 간단한 문제입니다. 예를 들어 텍스트는 다음과 같습니다.

Hello _{world \} \}} _{foo bar}

결과는 다음과 같습니다.

Hello *world } }* *foo bar*

어떻게 해야 하나요?

답변1

백슬래시가 "다음 문자 이스케이프"(중괄호, 다른 백슬래시 또는 줄 끝을 제외한 모든 문자)를 의미하는 경우 다음 문자를 다음과 같이 "건너뛸" 수 있습니다.

sed -r 's/_\{((\\.|[^}\\])+)\}/*\1*/g

백슬래시가 중괄호 앞에서만 특별한 의미를 갖는 경우 백슬래시를 1개 이상 실행할 때마다 백슬래시가 아닌 첫 번째 문자를 "건너뛰어야" 합니다.

sed -r 's/_\{((\\+[^\]|[^}\\])+)\}/*\1*/g'

답변2

선행하지 않는 항목을 일치시키려면 부정적인 뒤돌아보기가 필요합니다. sedLookahead와 Lookbehind는 지원되지 않지만 Perl은 지원합니다.

echo 'Hello _{world \} \}} _{foo bar}' | perl -npe 's/_\{(.+?)(?<!\\)}/*\1*/g'

그러면 다음이 출력됩니다.

Hello *world \} \}* *foo bar*

관련 정보