2014-08-29 3 views
0

Я пытаюсь использовать поиск + СЕПГ/AWK заменить эту строку:Найти и заменить несколько строк с помощью sed/awk?

main(argc, argv) 
int argc; 
char *argv[]; 
{ 

с:

int main(int argc, char *argv[]) 
{ 

Кто-нибудь знает, как это сделать?

Большое спасибо!

+0

Вы хотите решение только в sed? –

+0

Если возможно - я могу использовать find + sed для замены в большом количестве файлов. – James

+0

Если вы получаете решение в 'awk', не могли бы вы также использовать' find + awk'? – Barmar

ответ

1
cat test.txt 
    main(argc, argv) 
    int argc; 
    char *argv[]; 
    { 

с этим AWK она производит желаемый результат:

cat test.txt | awk 'BEGIN { args=""; nb=0; }; /main\(argc, argv\)/,/\{/ { if (!/^(main|\{).*$/) { tmp=$0; sub(/;/,"",tmp); if (nb) { args=(args "," tmp); nb+=1; } else { args=tmp; nb+=1;} };} END { print "main(" args ")\n{\n"; }' 

Выход:

main(int argc,char *argv[]) 
{ 

Подробная информация о AWK части:

BEGIN { args=""; nb=0; }; # Init Variables 
/(main\()argc, argv\)/,/\{/ { # for lines matching 'main' to line matching '{' 
    if (!/^(main|\{).*$/) { # if we're not on the main or { line 
    tmp=$0; # copy the match 
    sub(/;/,"",tmp); # remove the trailing ; 
    if (nb) { # if we're not on the first arg, concat with preceding separed by , 
     args=(args "," tmp); 
     nb+=1; 
    } else { # it is the first arg, just assign 
     args=tmp; 
     nb+=1; 
    } 
    }; 
} 
END { print "main(" args ")\n{\n"; } # we finished matching, print the result. 

Это только на вашем Например, если вам нужно что-то более сложное, вы ld сможет использовать группу соответствия и $ 1 $ 2 для имени функции, если это необходимо.

Редактировать: Я разрешаю вам продлить его для ваших нужд в замене в файлах.

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