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

  免費(fèi)注冊 查看新帖 |

Chinaunix

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

[文本處理] 如何用腳本替換一個.c文件中函數(shù)體的代碼 [復(fù)制鏈接]

論壇徽章:
2
15-16賽季CBA聯(lián)賽之四川
日期:2016-04-23 14:25:46操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-05-09 06:20:00
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-12-27 17:21 |只看該作者 |倒序瀏覽
本帖最后由 jeasun 于 2012-12-27 17:23 編輯

現(xiàn)在有段代碼不能動,只能在編譯前替換,現(xiàn)在要替換C語言一個函數(shù)的內(nèi)容,求思路,越簡單越好,可以不考慮效率。
已知 .c文件名,要替換的函數(shù)名,用來替換的代碼。

論壇徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年紀(jì)念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役紀(jì)念章
日期:2022-04-24 14:33:24
2 [報告]
發(fā)表于 2012-12-27 17:33 |只看該作者
把替換前和替換后的文本分別貼出來看看

論壇徽章:
2
15-16賽季CBA聯(lián)賽之四川
日期:2016-04-23 14:25:46操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-05-09 06:20:00
3 [報告]
發(fā)表于 2012-12-27 18:44 |只看該作者
本帖最后由 jeasun 于 2012-12-27 19:08 編輯

簡單的例子:
替換前a.c
------------------------------------------------------
int a()
{
    printf("hello in a\n");
    return 0;
}

int main()
{
     a();l
     return 0;
}
------------------------------------------------------

替換后a.c
------------------------------------------------------
int a()
{
    printf("hello in replace a\n");
    return 0;

}

int main()
{
     a();
     return 0;
}
-------------------------------------------------------
就是想把a(bǔ)函數(shù)的函數(shù)體的內(nèi)容替換。

論壇徽章:
0
4 [報告]
發(fā)表于 2012-12-27 19:29 |只看該作者
本帖最后由 rongpmcu 于 2012-12-27 19:51 編輯

知道函數(shù)的起始行和結(jié)束行就好辦了, 呵呵, 如果用{匹配的方法要考慮的就有點(diǎn)多了
如果你代碼很規(guī)范的話,根據(jù){}應(yīng)該不難
我對sed不熟悉,所以在實(shí)現(xiàn)這個的時候遇到一個糾結(jié)的問題,希望大家?guī)蛶兔Γ?br /> 我想在sed匹配時獲得行號然后放到變量里面  但是發(fā)現(xiàn)不行
于是只能用寫到文件里的笨方法  糾結(jié)啊
sed -n '/ a/{n;/^{/=}' a.c >start   獲得起始行,a為要替換的函數(shù)名
sed -n '/ a/{n;/^{/{:a; n;/^}/!b a; =}}' a.c >end  獲得結(jié)束行
如果用awk取行號倒是方便,就是我awk用的少,其實(shí)sed我也用的少,見笑了,呵呵

論壇徽章:
2
15-16賽季CBA聯(lián)賽之四川
日期:2016-04-23 14:25:46操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-05-09 06:20:00
5 [報告]
發(fā)表于 2012-12-27 21:23 |只看該作者
本帖最后由 jeasun 于 2012-12-27 21:52 編輯

num=`sed -n '/ a/{n;/^{/{:a; n;/^}/!b a; =}}' a.c`
num可以取到行號

替換這里是跨行的,這塊用啥命令?

比如:
  3 static int a()
  4 {
  5         char t = 'a';
  6         printf("%c\n", t);
  7         return 0;

  8 }

  3 static int a()
  4 {
  5         puts("a");
  6
  7         return 0;

  8 }

這個替換怎么做?

論壇徽章:
2
15-16賽季CBA聯(lián)賽之四川
日期:2016-04-23 14:25:46操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-05-09 06:20:00
6 [報告]
發(fā)表于 2012-12-27 22:20 |只看該作者
本帖最后由 jeasun 于 2012-12-27 22:25 編輯

接著rongpmcu的思路,找到了一種笨辦法;
獲取到起止行:
將起止行中間的換行符先去掉:
sed -i ':a;$!N;5,7s/\n//;ta' a.c
再從起始行開始替換:
sed -i  '5s/^.*$/{\nputs("a");\n\nreturn 0;\n}/g' a.c

謝謝rongpmcu! 如果還有更簡潔的思路,請大家再指導(dǎo)下。

論壇徽章:
0
7 [報告]
發(fā)表于 2012-12-27 23:03 |只看該作者
sed -n '/ a/{n;/^{/=}' a.c >start   獲得起始行,a為要替換的函數(shù)名
sed -n '/ a/{n;/^{/{:a; n;/^}/!b a; =}}' a.c >end  獲得結(jié)束行

能給詳細(xì)的說下這個模式嗎?

論壇徽章:
0
8 [報告]
發(fā)表于 2012-12-27 23:56 |只看該作者
替換文本寫到replace.txt中
  1. sed -rni '/int a()/{p;n;/\{/{p;r replace.txt         
  2. n;:a;/\}/!{n;ba}}};p' a.c
復(fù)制代碼

論壇徽章:
0
9 [報告]
發(fā)表于 2012-12-28 01:02 |只看該作者
回復(fù) 6# jeasun

我還是把自己的完成吧,呵呵
#!/bin/sh
[ $# != 2 ] && echo "Usage: $0 funcname target_file" && exit
funcname="$1"
tgtfile="$2"

s=$((`sed -n "/ $funcname/{n;/^{/=}" a.c `-1))
e=`sed -n "/ $funcname/{n;/^{/{:a; n;/^}/!b a; =}}" a.c`

if [ -n "$s" -a -n "$e" -a $s -lt $e ]; then
    sed -i -e "$s,$((e-1))d" -e "${e}x;${e}r ${tgtfile}" a.c
fi
記得備份,呵呵

論壇徽章:
2
15-16賽季CBA聯(lián)賽之四川
日期:2016-04-23 14:25:46操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-05-09 06:20:00
10 [報告]
發(fā)表于 2012-12-28 09:24 |只看該作者
回復(fù) 9# rongpmcu

這個太給力了!測試OK。
能給大概講講具體實(shí)現(xiàn)么?


   
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(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