다음과 같은 파일이 있습니다.
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줄로 제한하므로 분명히 위 명령은 실패합니다. 하지만 이 개념은 정확히 내가 원하는 것입니다.
- 패턴 목록 중 하나(
blah
또는 )와 일치합니다yada
. /*
그런 다음 일치하는 줄의 시작 부분에 원하는 텍스트( )를 추가하고 ,- 그리고 원하는 다른 텍스트(
*/
)를 다른 패턴과 일치하는 다음 줄의 끝에 추가합니다( ).);
여기서 일치하는 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
스크립트를 중단하고 :$
태그로 분기합니다. 실패하면 b
ranch 명령으로 점프하지 않고 분기만 하고 ^\$
일치할 때까지 입력을 자동으로 인쇄합니다.
일치하면 에서 시작하여 에서 끝나는 폐쇄 루프에 들어가므로 :$
루프가 완료될 때까지 b$
첫 번째 대체를 다시 시도하지 않습니다 . s///
루프의 끝에서 성공적인 교체에 대한 일치가 sed
t
추정되고 , 성공하면 스크립트에서 분기되어 다음 입력 라인(있는 경우)을 사용하여 처음부터 루프를 다시 시작합니다. 실행되기 전에 자동으로 반복적으로 인쇄한 다음 각 반복마다 외부 입력 라인으로 패턴 공간을 덮어쓰므 로 불필요하게 버퍼링되지 않습니다.);$
s///
n