2009-05-20 2 views
2

sed를 사용하여 파일에서 블록을 교체하려고하지만 성공하지 못했습니다.sed에서 블록 교체

예. 내가 이것을 대체 할 : 트릭을 할 것입니다

int i = 0; 
while(i < MAX_LOOPS) { 
    printf("Hello World!"); 
    ++i; 
} 
+0

대신 왜 사용 하시겠습니까? 에 대한? 내게는 가독성과 유지 보수성면에서 엄청난 다운 그레이드가되는 것 같다. – hlovdal

+0

여기에있는 어려움은 while() {} 루프 내에서 처리해야 할 것이 있습니다. 하나의 간단한 명령인데 중첩 된 블록 인 경우에는 다른 것입니다. – Beano

답변

1

다음하지만 아주 기본적인 방법으로, 즉 그것은 강력한 아니라도 아니다 서식 걱정 않습니다

이와
for(int i = 0; i < MAX_LOOPS; ++i) { 
    printf("Hello World!"); 
} 

합니다.

들/위해 (내가 < MAX_LOOPS, I = 0을 int로 ++ I)/INT I = 0; \ nwhile (I < MAX_LOOPS)/g /의 printf ("안녕하세요!");/{ a ++ i; }

이것은 간단한 해킹 일 뿐이지 만 당신을 끌어들일만큼 충분해야합니다. Sed는이 작업을위한 최선의 도구가 아닐 수도 있지만 Sed에서 수행하는 방법을 아는 것은 상처가되지 않습니다.

0

이 당신을 위해 작동 될 수 있습니다

sed -e '/^for.* {/,/^}/{/for/{i\int i = 0;'\ 
> -e ';c\while(i < MAX_LOOPS) {'\ 
> -e '}};/^}/i\++i' file 
int i = 0; 
while(i < MAX_LOOPS) { 
    printf("Hello World!"); 
++i 
} 
0
sed -r ' 
    /for\s*\(.*;.*;.*\)/!b 
    s#.*\((.*);(.*);(.*)\).*#\1\nwhile (\2) {\a\3# 
    h 
    s/.*\a// 
    x 
    s/\a.*// 
    :X 
    N 
    /}/!{bX} 
    G 
    s#(.*)\n(.*)\n(.*)#\1\n \3\n\2# 
' file 

int i = 0 
while (i < MAX_LOOPS) { 
    printf("Hello World!"); 
    ++i 
} 
0
sed -e ' 
    /for(int i = 0; i < MAX_LOOPS; ++i) {/,/}/ { 
     /}/ a \ 
int i = 0;\ 
while(i < MAX_LOOPS) {\ 
    printf("Hello World!");\ 
    ++i;\ 
} 
     d 
     } 
    ' YourFile 
  • 사이의 모든 행을 삭제 (내가 < MAX_LOOPS, I = 0을 int로 ++ I) {}
  • 에 도달하면에 새 콘텐츠를 추가합니다 (b 입력 행을 삭제하기 전에.

입력 및 출력 사이에 다른 동작이 사용됩니다. 현재 작업 버퍼에이 정보를 넣지 않고 출력에 정보를 추가하십시오 (입력 및 변조에 의한 피드). 그래서 삭제는이 필드를 건드릴 수 없지만 입력 (현재 줄 )은입니다.