使用sed / awk查找并替换多行?

时间:2014-08-29 12:47:54

标签: regex sed

我尝试使用find + sed / awk替换此字符串:

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

使用:

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

有谁知道怎么做?

非常感谢!

1 个答案:

答案 0 :(得分: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.

这只是你的例子,如果你需要更复杂的东西,你应该能够使用匹配组,如果需要,可以使用$ 1 $ 2作为函数名。

编辑:我允许您根据文件中的替换特殊需要扩展它。