Go 템플릿 문서의 sed 문제: "{{ foo.1 }}"를 {{"{{"}}foo.1{{"}}"}}로 바꿔보세요.

Go 템플릿 문서의 sed 문제: "{{ foo.1 }}"를 {{"{{"}}foo.1{{"}}"}}로 바꿔보세요.

저는 Go 템플릿 언어에 대한 Markdown 문서를 작성 중인데 이중 중괄호 쌍과 관련하여 몇 가지 복잡한 문제가 있습니다. 이중 중괄호로 묶인 텍스트를 표시하려면 이중 중괄호 자체가 이스케이프되므로 이스케이프가 필요합니다. 따라서 올바른 중괄호 쌍을 인용한 다음 이를 자체 중괄호 세트 내에 묶어야 합니다. 왼쪽 쌍에도 마찬가지입니다. 따라서 보호된 코드 예제의 경우 교체해야 합니다.

{{ foo.1 }}

그리고

{{"{{"}}foo.1{{"}}"}}

나는 곧 도착할 것이다. 내 코드는 작동하지만 원래 중괄호를 유지합니다. 지금까지 나는 이것을 가지고 있습니다 :

echo "{{ foo.1 }} {{ foo.2 }}" | sed -E 's#({{[^}}]*}})#{{"{{"}}\1{{"}}"}}#g'

결과 :

{{"{{"}}{{ foo.1 }}{{"}}"}} {{"{{"}}{{ foo.2 }}{{"}}"}}

위 예에서 가장 안쪽에 있는 중괄호 쌍을 어떻게 제거합니까?

답변1

당신의 표현에는 당황스러운 부분이 여러 가지 있습니다 sed.

  • [^}}]a와 동일 [^}]하며 a와 일치합니다.하나의가 아닌 문자입니다 }.
  • {}확장 정규식 중에서 특별합니다(and 처럼 작동합니다 . *+, 이전 표현식이 일치해야 하는 횟수를 지정합니다(예: a{2,4}2 와 4 사이 a). 이는 일부 sed구현(GNU)에서 표현식을 구문 분석하는 데 문제가 있음을 의미합니다.

여기서는 기본 정규식을 사용하고 sed그 안에 있는 단어에 {{ ... }}영숫자와 점이 포함될 수 있도록 허용합니다( [[:alnum:].]이를 로 변경할 수 있음 [^ ]).

$ echo '{{ foo.1 }} {{ foo.2 }}' | sed 's/{{ \([[:alnum:].]*\) }}/{{"{{"}} \1 {{"}}"}}/g'
{{"{{"}} foo.1 {{"}}"}} {{"{{"}} foo.2 {{"}}"}}

이것은 GNU sed와 BSD sed(귀하가 사용하고 있다고 생각합니다) 모두에서 작동합니다.

sed위의 표현은 다음과 같습니다 .거의 동일확장 정규식을 사용하지 않고 캡처 그룹을 단어로 옮겼다는 점을 제외하면 귀하와 동일합니다 {{ ... }}(결과에서 가장 안쪽 중괄호를 제거하는 방법입니다).

답변2

다음과 같은 오류 메시지가 나타납니다.

sed: -e 표현식 #1, char 35: 앞의 정규식이 유효하지 않습니다.

위의 sed. 시도 해봐

echo "{{ foo.1 }} {{ foo.2 }}" | sed  's/\({\|}\)\1/{{"&"}}/g'
{{"{{"}} foo.1 {{"}}"}} {{"{{"}} foo.2 {{"}}"}}

관련 정보