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 для имени функции, если это необходимо.
Редактировать: Я разрешаю вам продлить его для ваших нужд в замене в файлах.
Вы хотите решение только в sed? –
Если возможно - я могу использовать find + sed для замены в большом количестве файлов. – James
Если вы получаете решение в 'awk', не могли бы вы также использовать' find + awk'? – Barmar