2009-05-20 2 views
2

Я пытаюсь заменить блок в файле с помощью sed, но без успеха.Замена блока в sed

E.g. Я хочу, чтобы заменить это:

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

с этим:

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

Почему вы предпочитаете использовать вместо для? Для меня это кажется огромным понижением в читаемости и ремонтопригодности. – hlovdal

+0

Трудность здесь в том, что нужно обслуживать внутри цикла while() {} - если это просто простая инструкция, это одно, но если это вложенные блоки и т. Д., То это другое. – Beano

ответ

1

Ниже будет делать трюк, но в очень простой форме, то есть это не надежный и не беспокоиться с форматированием.

s/для (INT I = 0; я < MAX_LOOPS; ++ я)/INT I = 0; \ nВ то (I < MAX_LOOPS)/г /Е ("Hello World!");/{ A ++ я; }

Это просто быстрый хак, но этого должно быть достаточно, чтобы вы могли двигаться. 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 
  • удалить все строки между для (INT I = 0; я < MAX_LOOPS; ++ я) { и }
  • при достижении } добавить новое содержание (b перед удалением строки ввода.

Он использует различное поведение между входом и выводом. Добавляйте отправку информации на вывод, не помещая эту информацию в текущий рабочий буфер (подача по вводу и мутации), поэтому удаление не может касаться этого, но вход (текущая строка } здесь) хорошо коснулся

Смежные вопросы