亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 6160 | 回復(fù): 26
打印 上一主題 下一主題

請教,如何用sed匹配c函數(shù) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-12-03 07:56 |只看該作者 |倒序瀏覽
如:

int test (int argc, char ** argv)
{
        int value = 3;

       if (value == 1)
       {
              printf("%d", value);
       } else {
             if()
             {
                     printf("%d\n", value);
             }
       }
      
       if (value > 0) {
              printf("%d\n", value);
      }

        return 0;
}

將此函數(shù)在下面復(fù)制一份并重命名為 test_a

期望效果:
int test (int argc, char ** argv)
{
        int value = 3;

       if (value == 1)
       {
              printf("%d", value);
       } else {
             if()
             {
                     printf("%d\n", value);
             }
       }
      
       if (value > 0) {
              printf("%d\n", value);
      }

        return 0;
}

int test_a (int argc, char ** argv)
{
        int value = 3;

       if (value == 1)
       {
              printf("%d", value);
       } else {
             if()
             {
                     printf("%d\n", value);
             }
       }
      
       if (value > 0) {
              printf("%d\n", value);
      }

        return 0;
}

關(guān)鍵是如何匹配test的最外層{ }

小菜鳥, 對腳本不太懂,希望大家指教

論壇徽章:
2
射手座
日期:2014-10-10 15:59:4715-16賽季CBA聯(lián)賽之上海
日期:2016-03-03 10:27:14
2 [報告]
發(fā)表于 2011-12-03 09:34 |只看該作者
本帖最后由 yinyuemi 于 2011-12-03 10:02 編輯

回復(fù) 1# unbutun
針對你給出的例子:
  1. echo 'int test (int argc, char ** argv)
  2. {
  3.         int value = 3;

  4.        if (value == 1)
  5.        {
  6.               printf("%d", value);
  7.        } else {
  8.              if()
  9.              {
  10.                      printf("%d\n", value);
  11.              }
  12.        }

  13.        if (value > 0) {
  14.               printf("%d\n", value);
  15.       }

  16.         return 0;
  17. }'|sed -nr '
  18. /^[^ ]+.*\)$/{
  19. h;
  20. :a;
  21.   n;
  22.   H;
  23.   /\{/{
  24.     x;
  25.     s/^/#/;
  26.     x
  27.     };
  28.   /\}/{
  29.     x;
  30.     s/^#//;
  31.     /^[^#]/tb;
  32.     x;
  33.     }
  34.   ba;
  35. };
  36. :b;
  37. p;
  38. s/^([^ ]+ )([^ ]+)(.*\))/\1\2_a\3/p;'

  39. int test (int argc, char ** argv)
  40. {
  41.         int value = 3;

  42.        if (value == 1)
  43.        {
  44.               printf("%d", value);
  45.        } else {
  46.              if()
  47.              {
  48.                      printf("%d\n", value);
  49.              }
  50.        }

  51.        if (value > 0) {
  52.               printf("%d\n", value);
  53.       }

  54.         return 0;
  55. }
  56. int test_a (int argc, char ** argv)
  57. {
  58.         int value = 3;

  59.        if (value == 1)
  60.        {
  61.               printf("%d", value);
  62.        } else {
  63.              if()
  64.              {
  65.                      printf("%d\n", value);
  66.              }
  67.        }

  68.        if (value > 0) {
  69.               printf("%d\n", value);
  70.       }

  71.         return 0;
  72. }

復(fù)制代碼

論壇徽章:
2
射手座
日期:2014-10-10 15:59:4715-16賽季CBA聯(lián)賽之上海
日期:2016-03-03 10:27:14
3 [報告]
發(fā)表于 2011-12-03 10:11 |只看該作者
  1. sed -nr '
  2. /^[^ ]+.*\)$/,/return [^;]*;/{
  3.   H;
  4.   /return [^;]*;/{
  5.    x;
  6.    s/\n//;
  7.    s/$/\n}/p
  8.    s/^([^ ]+ )([^ ]+)(.*\))/\1\2_a\3/p;
  9.    s/.*//;
  10.    h
  11.   }
  12. }
  13. '
復(fù)制代碼

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
4 [報告]
發(fā)表于 2011-12-03 12:53 |只看該作者
用sed解決,的確有點復(fù)雜.
其實思路還是很簡單,一個棧,{進,}出,直到?.awk可能比較明了一點

論壇徽章:
0
5 [報告]
發(fā)表于 2011-12-03 14:53 |只看該作者
回復(fù) 4# cjaizss


    哦,能否指點下,多謝

同時非常感謝yinyuemi,很熱心,多謝你們

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
6 [報告]
發(fā)表于 2011-12-03 15:12 |只看該作者
回復(fù)  cjaizss


    哦,能否指點下,多謝

同時非常感謝yinyuemi,很熱心,多謝你們
unbutun 發(fā)表于 2011-12-03 14:53



    打個比方,{代表進棧,}代表出棧,
    那么
  s/[^{}]//g過濾所有的空格;
   然后
  :a;
   s/\{\}//;
   ta;
   之后就只剩下多余的{或者}

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
7 [報告]
發(fā)表于 2011-12-03 15:13 |只看該作者
打個比方,{代表進棧,}代表出棧,
    那么
  s/[^{}]//g過濾所有的空格;
   然后
  :a;
   s ...
cjaizss 發(fā)表于 2011-12-03 15:12



    如果不考慮字符串里的{或者}就很容易去做到了.
   "{"
   這種情況要考慮的話就要更加麻煩一點

論壇徽章:
1
技術(shù)圖書徽章
日期:2013-09-25 21:06:29
8 [報告]
發(fā)表于 2011-12-03 16:02 |只看該作者
回復(fù) 3# yinyuemi


    請問下,第3行的H 會不會對第5行的x造成影響呢?  {}里面的hold空間和外面的hold空間一致嗎?

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
9 [報告]
發(fā)表于 2011-12-03 16:36 |只看該作者
以上是原理,我就不寫數(shù)學(xué)證明了.
現(xiàn)在來實現(xiàn)編碼,
假設(shè)編程習(xí)慣不像以下這樣惡心:
int func(){}int func2{}
函數(shù)寫到一行去,那么以下是可以使用的代碼

  1. linux-0gt0:/tmp/test # cat 2.sed
  2. #!/bin/sed -nrf
  3. /int[ \t]+test[ \t]*\(/!d
  4. h

  5. :a
  6. n
  7. H
  8. /\{/ {
  9.         s/[^{}]//g
  10.         H
  11.         bb
  12. }
  13. ba

  14. :b
  15. n
  16. H
  17. :c
  18. s/[^{}]//g
  19. tc #clear s
  20. H
  21. x
  22. s/(\n[^\n]*)(\n[^\n]*)\n([^\n]*)$/\2\1\3/
  23. td
  24. :d
  25. s/(\n[^\n]*)\{\}([^\n]*)$/\1\2/
  26. td
  27. /\n$/ {
  28.         s/\n$//p
  29.         s/^[ \t]*int[ \t]+test/&_a/p
  30.         q
  31. }
  32. x
  33. bb
  34. linux-0gt0:/tmp/test # cat test.c
  35. #include <stdio.h>
  36. int test()
  37. {
  38.         {   int i=0;{printf("%d",i);}
  39.                 printf("%d\n",1);for(i=0;i<100;i++){printf("%d",i);{int j;for(j=0;j<100;j++){printf("test");}}}
  40.         }
  41. }
  42. int main()
  43. {
  44.         return 0;
  45. }
  46. linux-0gt0:/tmp/test # ./2.sed test.c
  47. int test()
  48. {
  49.         {   int i=0;{printf("%d",i);}
  50.                 printf("%d\n",1);for(i=0;i<100;i++){printf("%d",i);{int j;for(j=0;j<100;j++){printf("test");}}}
  51.         }
  52. }
  53. int test_a()
  54. {
  55.         {   int i=0;{printf("%d",i);}
  56.                 printf("%d\n",1);for(i=0;i<100;i++){printf("%d",i);{int j;for(j=0;j<100;j++){printf("test");}}}
  57.         }
  58. }

復(fù)制代碼

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
10 [報告]
發(fā)表于 2011-12-03 16:38 |只看該作者
yinyuemi 發(fā)表于 2011-12-03 10:11

  1. linux-0gt0:/tmp/test # cat test.c
  2. #include <stdio.h>
  3. int test()
  4. {
  5.         {   int i=0;{printf("%d",i);}
  6.                 printf("%d\n",1);for(i=0;i<100;i++){printf("%d",i);{int j;for(j=0;j<100;j++){printf("test");}}}
  7.         }
  8. }
  9. int main()
  10. {
  11.         return 0;
  12. }
  13. linux-0gt0:/tmp/test # cat test.c | sed -nr '

  14. /^[^ ]+.*\)$/,/return [^;]*;/{

  15.   H;

  16.   /return [^;]*;/{

  17.    x;

  18.    s/\n//;

  19.    s/$/\n}/p

  20.    s/^([^ ]+ )([^ ]+)(.*\))/\1\2_a\3/p;

  21.    s/.*//;

  22.    h

  23.   }

  24. }

  25. '
  26. int test()
  27. {
  28.         {   int i=0;{printf("%d",i);}
  29.                 printf("%d\n",1);for(i=0;i<100;i++){printf("%d",i);{int j;for(j=0;j<100;j++){printf("test");}}}
  30.         }
  31. }
  32. int main()
  33. {
  34.         return 0;
  35. }
  36. int test()
  37. {
  38.         {_a   int i=0;{printf("%d",i);}
  39.                 printf("%d\n",1);for(i=0;i<100;i++){printf("%d",i);{int j;for(j=0;j<100;j++){printf("test");}}}
  40.         }
  41. }
  42. int main()
  43. {
  44.         return 0;
  45. }

復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP