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

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

Chinaunix

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

[文本處理] 如何用AWK或sed或Perl替換這樣的文本?高手測試 :) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-12-13 13:32 |只看該作者 |倒序?yàn)g覽
本帖最后由 預(yù)言家 于 2012-12-13 14:26 編輯

想把乘法符號 "*" 替換成 "tensor", 指數(shù)符號 "^" 替換成 "p_tensor"

替換規(guī)則如下:
        a(k)^n --> p_tensor(n,a(k))
        a(i)*a(j) --> tensor(a(i),a(j)), when i=/=j
但當(dāng)乘法符號 "*" 出現(xiàn)在數(shù)字和a(i)之間時, 譬如 3*a(i), 則保留該符號"*",不進(jìn)行替換

譬如,

        5*a(i)*a(j)*(a(k1)+3*a(k2)) --> 5*tensor(tensor(a(i),a(j)),a(k1)+3*a(k2))
        a(i)^2*a(j)^2  --> tensor(p_tensor(2,a(i)),p_tensor(2,a(j)))
        ...

現(xiàn)在想用AWK 或 Sed 或 Perl 對下面的表達(dá)式進(jìn)行替換(有多行類似這樣的):

        3*a(3)^2+6*a(1)^2*(5*a(2)^2-2*a(4))+6*a(2)*a(4)+6*a(1)*(-4*a(2)*a(3)+a(5))

有辦法可以實(shí)現(xiàn)麼?

替換后的結(jié)果應(yīng)該是這樣子的:

        3*p_tensor(2,a(3))+6*tensor(p_tensor(2,a(1)),(5*p_tensor(2,a(2))-2*a(4))+6*tensor(a(2),a(4))+6*tensor(a(1),(-4*tensor(a(2),a(3))+a(5))

論壇徽章:
2
射手座
日期:2014-10-10 15:59:4715-16賽季CBA聯(lián)賽之上海
日期:2016-03-03 10:27:14
2 [報告]
發(fā)表于 2012-12-14 01:53 |只看該作者
這已經(jīng)不是簡單的替換吧,應(yīng)該是寫一個命令解釋器

論壇徽章:
0
3 [報告]
發(fā)表于 2012-12-14 04:41 |只看該作者
yinyuemi 發(fā)表于 2012-12-14 01:53
這已經(jīng)不是簡單的替換吧,應(yīng)該是寫一個命令解釋器


可以講講怎樣寫一個處理這個簡單算法的命令解釋器嗎?

論壇徽章:
3
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
4 [報告]
發(fā)表于 2012-12-14 08:54 |只看該作者
yinyuemi 發(fā)表于 2012-12-14 01:53
這已經(jīng)不是簡單的替換吧,應(yīng)該是寫一個命令解釋器

同意~~
我用平衡組只能取出所有符合要求的元素,替換的話 就麻煩了。。替換還要嵌套回去

論壇徽章:
93
2015年辭舊歲徽章
日期:2019-10-10 10:51:15CU大;照
日期:2014-02-21 14:21:56CU十二周年紀(jì)念徽章
日期:2020-10-15 16:55:55CU大;照
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大;照
日期:2019-10-10 10:55:38季節(jié)之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季節(jié)之章:冬
日期:2019-10-10 10:57:17CU大;照
日期:2014-02-21 14:22:52CU大;照
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
5 [報告]
發(fā)表于 2012-12-14 10:12 |只看該作者
括號和你的結(jié)果有此許不同,你檢查檢查,另外從簡考慮,使用 /([a-z]+\([^()^]+\))\^([0-9])/ 的正則,所以暫不支持a(a(i))^2這樣的嵌套格式,只支持 a(i)^2 的單層格式,如果有需要你再改進(jìn)這個正則就行了:
  1. [seesea2517@UC ~]# awk -f a.awk a.txt
  2. 原始:5*a(i)*a(j)*(a(k1)+3*a(k2))
  3. 替換:5*tensor(tensor(a(i),a(j)),(a(k1)+3*a(k2)))
  4. -------------
  5. 原始:a(i)^2*a(j)^2
  6. 替換:tensor(p_tensor(2,a(i)),p_tensor(2,a(j)))
  7. -------------
  8. 原始:3*a(3)^2+6*a(1)^2*(5*a(2)^2-2*a(4))+6*a(2)*a(4)+6*a(1)*(-4*a(2)*a(3)+a(5))

  9. 替換:3*p_tensor(2,a(3))+6*tensor(p_tensor(2,a(1)),(5*p_tensor(2,a(2))-2*a(4)))+
  10. 6*tensor(a(2),a(4))+6*tensor(a(1),(-4*tensor(a(2),a(3))+a(5)))
  11. -------------
  12. 原始:5*a(2)^2-2*a(4)
  13. 替換:5*p_tensor(2,a(2))-2*a(4)
  14. -------------

  15. [seesea2517@UC ~]# cat a.txt
  16. 5*a(i)*a(j)*(a(k1)+3*a(k2))
  17. a(i)^2*a(j)^2
  18. 3*a(3)^2+6*a(1)^2*(5*a(2)^2-2*a(4))+6*a(2)*a(4)+6*a(1)*(-4*a(2)*a(3)+a(5))
  19. 5*a(2)^2-2*a(4)
  20. [seesea2517@UC ~]# cat a.awk
  21. function tensor(line, _ARGEND_, ar, len, i, str, flag, ar_tokens, count, result,
  22. temp)
  23. {
  24.     count = 0
  25.     str  = ""
  26.     flag = 0
  27.     i = 1
  28.     len  = split(line, ar, "")

  29.     if (ar[1] == "(")
  30.     {
  31.         if (ar[len] != ")")
  32.         {
  33.             print "括號不匹配。"
  34.             exit
  35.         }

  36.         ++i
  37.         --len
  38.     }

  39.     for (; i <= len; ++i)
  40.     {
  41.         if (ar[i] == "(")
  42.             flag++

  43.         if (ar[i] == ")")
  44.             flag--

  45.         if (flag < 0)
  46.         {
  47.             print "括號不匹配。"
  48.             exit
  49.         }

  50.         if (flag == 0 && (ar[i] ~ /[+*/]/ || (ar[i] == "-" && ar[i-1] ~ /[0-9)]/
  51. )))
  52.         {
  53.             ar_tokens[count++] = ar[i]
  54.             str = ""
  55.             continue
  56.         }

  57.         str = str""ar[i]
  58.         if (i == len || (ar[i+1] ~ /[-+*/]/ && flag == 0))
  59.         {
  60.             if (str ~ /^\(/)
  61.             {
  62.                 ar_tokens[count++] = "("tensor(str)")"
  63.             } else {
  64.                 ar_tokens[count++] = str
  65.             }
  66.         }
  67.     }

  68.     result = ""
  69.     temp = ""
  70.     for (i = 0; i < count; ++i)
  71.     {
  72.         if (temp == "")
  73.             temp = ar_tokens[i]

  74.         if (ar_tokens[i+1] == "*" && temp !~ /^[-0-9]+$|^$/)
  75.         {
  76.             temp = "tensor("temp","ar_tokens[i+2]")"
  77.             i += 2

  78.             if (i < count)
  79.             {
  80.                 i--
  81.                 continue
  82.             }
  83.         }

  84.         result = result""temp
  85.         temp = ""
  86.     }

  87.     return result
  88. }

  89. BEGIN {
  90.     FS=""
  91. }

  92. {
  93.     print "原始:" $0
  94.     print "替換:" gensub(/([a-z]+\([^()^]+\))\^([0-9])/, "p_tensor(\\2,\\1)", "g", tensor($0))
  95.     print "-------------"
  96. }
復(fù)制代碼

論壇徽章:
93
2015年辭舊歲徽章
日期:2019-10-10 10:51:15CU大;照
日期:2014-02-21 14:21:56CU十二周年紀(jì)念徽章
日期:2020-10-15 16:55:55CU大;照
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季節(jié)之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季節(jié)之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
6 [報告]
發(fā)表于 2012-12-14 10:14 |只看該作者
屏幕寬度不夠換行了,修正一下:
  1. [seesea2517@UC ~]# awk -f a.awk a.txt
  2. 原始:5*a(i)*a(j)*(a(k1)+3*a(k2))
  3. 替換:5*tensor(tensor(a(i),a(j)),(a(k1)+3*a(k2)))
  4. -------------
  5. 原始:a(i)^2*a(j)^2
  6. 替換:tensor(p_tensor(2,a(i)),p_tensor(2,a(j)))
  7. -------------
  8. 原始:3*a(3)^2+6*a(1)^2*(5*a(2)^2-2*a(4))+6*a(2)*a(4)+6*a(1)*(-4*a(2)*a(3)+a(5))

  9. 替換:3*p_tensor(2,a(3))+6*tensor(p_tensor(2,a(1)),(5*p_tensor(2,a(2))-2*a(4)))+6*tensor(a(2),a(4))+6*tensor(a(1),(-4*tensor(a(2),a(3))+a(5)))
  10. -------------
  11. 原始:5*a(2)^2-2*a(4)
  12. 替換:5*p_tensor(2,a(2))-2*a(4)
  13. -------------

  14. [seesea2517@UC ~]# cat a.txt
  15. 5*a(i)*a(j)*(a(k1)+3*a(k2))
  16. a(i)^2*a(j)^2
  17. 3*a(3)^2+6*a(1)^2*(5*a(2)^2-2*a(4))+6*a(2)*a(4)+6*a(1)*(-4*a(2)*a(3)+a(5))
  18. 5*a(2)^2-2*a(4)
  19. [seesea2517@UC ~]# cat a.awk
  20. function tensor(line, _ARGEND_, ar, len, i, str, flag, ar_tokens, count, result, temp)
  21. {
  22.     count = 0
  23.     str  = ""
  24.     flag = 0
  25.     i = 1
  26.     len  = split(line, ar, "")

  27.     if (ar[1] == "(")
  28.     {
  29.         if (ar[len] != ")")
  30.         {
  31.             print "括號不匹配。"
  32.             exit
  33.         }

  34.         ++i
  35.         --len
  36.     }

  37.     for (; i <= len; ++i)
  38.     {
  39.         if (ar[i] == "(")
  40.             flag++

  41.         if (ar[i] == ")")
  42.             flag--

  43.         if (flag < 0)
  44.         {
  45.             print "括號不匹配。"
  46.             exit
  47.         }

  48.         if (flag == 0 && (ar[i] ~ /[+*/]/ || (ar[i] == "-" && ar[i-1] ~ /[0-9)]/)))
  49.         {
  50.             ar_tokens[count++] = ar[i]
  51.             str = ""
  52.             continue
  53.         }

  54.         str = str""ar[i]
  55.         if (i == len || (ar[i+1] ~ /[-+*/]/ && flag == 0))
  56.         {
  57.             if (str ~ /^\(/)
  58.             {
  59.                 ar_tokens[count++] = "("tensor(str)")"
  60.             } else {
  61.                 ar_tokens[count++] = str
  62.             }
  63.         }
  64.     }

  65.     result = ""
  66.     temp = ""
  67.     for (i = 0; i < count; ++i)
  68.     {
  69.         if (temp == "")
  70.             temp = ar_tokens[i]

  71.         if (ar_tokens[i+1] == "*" && temp !~ /^[-0-9]+$|^$/)
  72.         {
  73.             temp = "tensor("temp","ar_tokens[i+2]")"
  74.             i += 2

  75.             if (i < count)
  76.             {
  77.                 i--
  78.                 continue
  79.             }
  80.         }

  81.         result = result""temp
  82.         temp = ""
  83.     }

  84.     return result
  85. }

  86. BEGIN {
  87.     FS=""
  88. }

  89. {
  90.     print "原始:" $0
  91.     print "替換:" gensub(/([a-z]+\([^()^]+\))\^([0-9])/, "p_tensor(\\2,\\1)", "g", tensor($0))
  92.     print "-------------"
  93. }
復(fù)制代碼

論壇徽章:
0
7 [報告]
發(fā)表于 2012-12-14 11:05 |只看該作者
很好很強(qiáng)大 搬來板凳細(xì)看

seesea2517 發(fā)表于 2012-12-14 10:14
屏幕寬度不夠換行了,修正一下:

論壇徽章:
93
2015年辭舊歲徽章
日期:2019-10-10 10:51:15CU大;照
日期:2014-02-21 14:21:56CU十二周年紀(jì)念徽章
日期:2020-10-15 16:55:55CU大;照
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大;照
日期:2019-10-10 10:55:38季節(jié)之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季節(jié)之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大;照
日期:2014-03-13 10:40:30CU大;照
日期:2014-02-21 14:23:15
8 [報告]
發(fā)表于 2012-12-14 11:09 |只看該作者
回復(fù) 7# 預(yù)言家


    代碼很丑,能不看盡量別看……

論壇徽章:
0
9 [報告]
發(fā)表于 2012-12-14 11:56 |只看該作者
本帖最后由 預(yù)言家 于 2012-12-14 11:57 編輯

完美!

在倒數(shù)第三行加上"+", 這樣當(dāng)指數(shù)為多位數(shù)字的時候,也可以匹配
print "替換:" gensub(/([a-z]+\([^()^]+\))\^([0-9]+)/, "p_tensor(\\2,\\1)", "g", tensor($0))


回復(fù) 6# seesea2517


   

論壇徽章:
0
10 [報告]
發(fā)表于 2012-12-14 12:02 |只看該作者
seesea2517 發(fā)表于 2012-12-14 11:09
回復(fù) 7# 預(yù)言家


哈 強(qiáng)大就好

以下是用perl寫的,只能匹配最簡單的情形,沒有你的強(qiáng)大

  1. $cat tensor.pl

  2. while(<>) {
  3.    s/(a\(\d+\))\^(\d+)/p_tensor($2,$1)/g;
  4.    s/(a\((\d+)\))\*(a\((\d+)\))/tensor($1, $3)/g if $2 != $4;
  5.    print;
  6. }
復(fù)制代碼

  1. echo "3*a(3)^2+6*a(1)^2*(5*a(2)^2-2*a(4))+6*a(2)*a(4)+6*a(1)*(-4*a(2)*a(3)+a(5))" | perl tensor.pl
復(fù)制代碼
得到

  1.   3*p_tensor(2,a(3))+**6*p_tensor(2,a(1))*(5*p_tensor(2,a(2))**-2*a(4))+6*tensor(a(2), a(4))+6*a(1)*(-4*tensor(a(2), a(3))+a(5))
復(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