수학 표현식에서 대괄호를 대괄호로 바꾸고 sed에서 역참조를 사용하세요.

수학 표현식에서 대괄호를 대괄호로 바꾸고 sed에서 역참조를 사용하세요.

역참조에서 sed이벤트나 패턴의 발생을 참조와 동일한 횟수로 바꿀 수 있습니까?

예: 주어진 입력에 대해

((23 + 5)(23 + 5))
11 x (2+1) = 11 x 3 = 33
3x(5+2)

역참조만 사용하여 (with [및 의 모든 항목을 대체해야 합니다 )(이 문제는 이미 and를 사용하여 해결되었습니다). 브래킷의 수도 다를 수 있습니다.]sedtrsed

답변1

(모든 것을 and [로 바꾸고 싶다면 역참조 )]필요하지 않습니다. 간단한 tr작업을 수행할 수 있습니다.

$ tr '()' '[]' <file
[[23 + 5][23 + 5]]
11 x [2+1] = 11 x 3 = 33
3x[5+2]

또는 sed,

$ sed 'y/()/[]/' <file
[[23 + 5][23 + 5]]
11 x [2+1] = 11 x 3 = 33
3x[5+2]

역참조는 입력에 있는 내용을 그 자체로만 바꿀 수 있으므로 대괄호 사이의 내용을 일치시킨 다음 대괄호 안의 동일한 내용으로 바꾸려고 한다고 가정합니다. 루프를 사용하여 이 작업을 수행할 수 있습니다.

$ sed -E -e ':loop' -e 's/\(([^()]+)\)/[\1]/; tloop' <file
[[23 + 5][23 + 5]]
11 x [2+1] = 11 x 3 = 33
3x[5+2]

여기서는 먼저 레이블을 정의한 loop다음 교체합니다. 대체가 효과가 있으면 레이블로 돌아갑니다 loop. 를 사용하면 s/.../.../g겹치는 일치 항목을 찾을 수 없지만 중첩된 괄호가 있을 때마다 겹치는 일치 항목이 있기 때문에 이 작업을 수행해야 합니다 .

바꾸기는 괄호 안에 또는 를 포함하지 않는 비어 있지 않은 문자열을 s/\(([^()]+)\)/[\1]/찾아 자체적으로 바꾸지만 주변 괄호를 대괄호로 바꿉니다.()

입력 라인의 경우

((23 + 5)(23 + 5))

이로 인해 sed교체가 4번 수행됩니다.

  1. ([23 + 5](23 + 5)), 첫 번째 내부 브래킷이 교체됩니다.
  2. ([23 + 5][23 + 5]), 그리고 두 번째 내부 항목입니다.
  3. [[23 + 5][23 + 5]], 그리고 외부 레이어.
  4. 마지막 대체는 아무 작업도 수행하지 않으며 루프가 종료됩니다.

대체 표현식 끝에 플래그를 사용하면 g위의 처음 두 단계가 겹치지 않기 때문에 동일한 대체에서 수행됩니다.


동등한 기본 정규 표현식 사용(가독성을 위해 위에는 확장 정규 표현식이 사용됨):

sed -e ':loop' -e 's/(\([^()][^()]*\))/[\1]/; tloop' <file

관련 정보