역참조에서 sed
이벤트나 패턴의 발생을 참조와 동일한 횟수로 바꿀 수 있습니까?
예: 주어진 입력에 대해
((23 + 5)(23 + 5))
11 x (2+1) = 11 x 3 = 33
3x(5+2)
역참조만 사용하여 (
with [
및 의 모든 항목을 대체해야 합니다 )
(이 문제는 이미 and를 사용하여 해결되었습니다). 브래킷의 수도 다를 수 있습니다.]
sed
tr
sed
답변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번 수행됩니다.
([23 + 5](23 + 5))
, 첫 번째 내부 브래킷이 교체됩니다.([23 + 5][23 + 5])
, 그리고 두 번째 내부 항목입니다.[[23 + 5][23 + 5]]
, 그리고 외부 레이어.- 마지막 대체는 아무 작업도 수행하지 않으며 루프가 종료됩니다.
대체 표현식 끝에 플래그를 사용하면 g
위의 처음 두 단계가 겹치지 않기 때문에 동일한 대체에서 수행됩니다.
동등한 기본 정규 표현식 사용(가독성을 위해 위에는 확장 정규 표현식이 사용됨):
sed -e ':loop' -e 's/(\([^()][^()]*\))/[\1]/; tloop' <file