Замена блока в седе - PullRequest
2 голосов
/ 20 мая 2009

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

например. Я хочу заменить это:

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

С этим:

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

Ответы [ 4 ]

1 голос
/ 23 мая 2009

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

с / для (int i = 0; i

Это просто быстрый взлом, но этого должно быть достаточно, чтобы вы начали. Sed, возможно, не лучший инструмент для этой работы, но не помешает узнать, как это сделать в Sed.

0 голосов
/ 23 января 2017
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; i и }
  • при достижении } добавить новый контент (перед удалением строки ввода.

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

0 голосов
/ 23 января 2017
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 голосов
/ 13 декабря 2011

Это может работать для вас:

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
}
...