줄의 시작 부분부터 다른 줄 끝의 두 번째 패턴까지 여러 패턴 중 하나로 교체

줄의 시작 부분부터 다른 줄 끝의 두 번째 패턴까지 여러 패턴 중 하나로 교체

다음과 같은 파일이 있습니다.

data data data
$globaltext blah gibberjabber
somemorestuff etc
);
data data data
$otherjunk yada gibberish
etc etc
more etc
);

내가 원하는 결과는 다음 파일입니다.

data data data
/*$globaltext blah gibberjabber
somemorestuff etc
);*/
data data data
/*$otherjunk yada gibberish
etc etc
more etc
);*/

for 루프를 사용하여 이 작업을 수행하는 방법을 알고 있지만 이를 달성하려면 다음과 같이 sed한 줄 명령을 사용하고 싶습니다 .sed

sed '/blah\|yada/s/^\(\$.*)\;\)/\/\*\1\*\//' filename

시작 부분의 패턴 일치는 검색을 1줄로 제한하므로 분명히 위 명령은 실패합니다. 하지만 이 개념은 정확히 내가 원하는 것입니다.

  1. 패턴 목록 중 하나( blah또는 )와 일치합니다 yada.
  2. /*그런 다음 일치하는 줄의 시작 부분에 원하는 텍스트( )를 추가하고 ,
  3. 그리고 원하는 다른 텍스트( */)를 다른 패턴과 일치하는 다음 줄의 끝에 추가합니다( ). );여기서 일치하는 2개의 항목은 서로 다른 줄 수를 갖습니다(항상 2줄씩 떨어져 있는 것은 아닙니다).

이것이 가능합니까, 아니면 for 루프나 더 나은 것을 사용해야 합니까?

저는 쉘 스크립팅을 처음 접하기 때문에 주로 학습이 필요합니다.

답변1

sed   -e's|^\$|/*&|;t$' -eb -e:$      -e'### handle top end of loop' \
      -e's|);$|&*/|;t'  -en -eb$      -e'### handle the bottom end'

data data data
/*$globaltext blah gibberjabber
somemorestuff etc
);*/
data data data
/*$otherjunk yada gibberish
etc etc
more etc
);*/

s///시도된 교체가 모두 t적용되었습니다. 첫 번째 경우 교체가 성공 sed하면아니요결국 b스크립트를 중단하고 :$태그로 분기합니다. 실패하면 branch 명령으로 점프하지 않고 분기만 하고 ^\$일치할 때까지 입력을 자동으로 인쇄합니다.

일치하면 에서 시작하여 에서 끝나는 폐쇄 루프에 들어가므로 :$루프가 완료될 때까지 b$첫 번째 대체를 다시 시도하지 않습니다 . s///루프의 끝에서 성공적인 교체에 대한 일치가 sed t추정되고 , 성공하면 스크립트에서 분기되어 다음 입력 라인(있는 경우)을 사용하여 처음부터 루프를 다시 시작합니다. 실행되기 전에 자동으로 반복적으로 인쇄한 다음 각 반복마다 외부 입력 라인으로 패턴 공간을 덮어쓰므 로 불필요하게 버퍼링되지 않습니다.);$s///n

관련 정보