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

Chinaunix

標題: shell文本替換問題,歡迎應(yīng)戰(zhàn) [打印本頁]

作者: bt21cnzy21st    時間: 2015-08-31 15:37
標題: shell文本替換問題,歡迎應(yīng)戰(zhàn)
本帖最后由 bt21cnzy21st 于 2015-08-31 19:24 編輯

有一個文本,具體替換原則是:

1.遇到cco1{},將cco1{} 替換為cco1(),并將{}內(nèi)的逗號,全替換為|  (cco1內(nèi)的字段數(shù)量是不固定的)
2.遇到cbax[],將[]內(nèi)的{}全替換為(), 并將[]內(nèi)的逗號,全替換為|    (cbax內(nèi)的字段數(shù)量是不固定的)

具體如下:
             cco1{-1, 0, -1, 1438081612000, 70, 0, 0}
替換為:  cco1(-1| 0| -1|1438081612000| 70| 0| 0)


            cbax[{"OnPeakAccountID", 1800, 997699, 1970-01-01 07:00:00, 0}, {"FreeUnits", 1800, 997699, 1970-01-01 07:00:00, 0}]
替換為:cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)]

最終效果是如下,其中只替換有cco1和cbax后的部分,其他不管

原文:
(1,1,{1,1,cco1{-1,0, -1,1438081612000,70, 0, 0},cbax[{"OnPeakAccountID", 1800, 997699, 1970-01-01 07:00:00, 0}, {"FreeUnits", 1800, 997699, 1970-01-01 07:00:00, 0}]})

替換后:
(1,1,{1,1,cco1(-1|0| -1|1438081612000|70| 0| 0),cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)]})



作者: bt21cnzy21st    時間: 2015-08-31 15:44
自己頂一下,up
作者: hjfeng1988    時間: 2015-08-31 15:48
  1. [root@66a awk]# cat what.sh
  2. #!/bin/awk
  3. /cco1{/{
  4.         sub(/{/,"(");
  5.         sub(/}/,")");
  6.         gsub(/,/,"|");
  7.         print
  8. }
  9. /cbax\[/{
  10.         gsub(/{/,"(");
  11.         gsub(/}/,")");
  12.         gsub(/,/,"|");
  13.         print
  14. }
  15. [root@66a awk]# awk -f what.sh file
  16. cco1(-1| 0| -1| 1438081612000| 70| 0| 0)
  17. cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)]
復(fù)制代碼
嚴謹?shù)膶懖粊?hr noshade size="2" width="100%" color="#808080"> 作者: jason680    時間: 2015-08-31 16:41
http://www.72891.cn/thread-4181691-1-1.html
http://www.72891.cn/thread-4181843-1-1.html
作者: Shell_HAT    時間: 2015-08-31 17:06
戰(zhàn)勝之后有何獎勵?
作者: rulebook    時間: 2015-08-31 17:36
  1. sed -r 's/,/\|/g ;s/\{/\(/ ;s/\}/\)/'
復(fù)制代碼

作者: Herowinter    時間: 2015-08-31 17:41
回復(fù) 1# bt21cnzy21st

  1. while read line;do if [[ "$line" =~ "cco1\{[^}]*\}" ]];then echo "$line"|tr "{}," "()|";elif [[ "$line" =~ "cbax\[[^]]*\]" ]];then echo "$line"|tr "{}," "()|";else echo "$line";fi;done<i
  2. cco1(-1| 0| -1| 1438081612000| 70| 0| 0)
  3. cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)]
復(fù)制代碼

作者: bt21cnzy21st    時間: 2015-08-31 19:12
本帖最后由 bt21cnzy21st 于 2015-08-31 19:13 編輯

回復(fù) 3# hjfeng1988

你好,你得代碼我驗證后不對呀,我想要最終效果是,其中只替換有cco1和cbax后的部分,其他不管
原文:
(1,1,{1,1,cco1{-1,0, -1,1438081612000,70, 0, 0},cbax[{"OnPeakAccountID", 1800, 997699, 1970-01-01 07:00:00, 0}, {"FreeUnits", 1800, 997699, 1970-01-01 07:00:00, 0}]})

替換后:
(1,1,{1,1,cco1(-1|0| -1|1438081612000|70| 0| 0),cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)]})



   
作者: bt21cnzy21st    時間: 2015-08-31 19:17
回復(fù) 4# jason680

不好意思前輩,之前是提過相關(guān)問題, 但現(xiàn)在需求有變,并且之前是采用的循環(huán)一個一個字節(jié)讀取并替換,性能不佳,現(xiàn)在的要求我已經(jīng)更新到主貼中了, 耽誤你寶貴時間再次review一下吧




   
作者: bt21cnzy21st    時間: 2015-08-31 19:20
回復(fù) 5# Shell_HAT
戰(zhàn)個痛快,不吝指教,

具體如下:
             cco1{-1, 0, -1, 1438081612000, 70, 0, 0}
替換為:  cco1(-1| 0| -1|1438081612000| 70| 0| 0)


             cbax[{"OnPeakAccountID", 1800, 997699, 1970-01-01 07:00:00, 0}, {"FreeUnits", 1800, 997699, 1970-01-01 07:00:00, 0}]
替換為:cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)]

最終效果是如下,其中只替換有cco1和cbax后的部分,其他不管

原文:
(1,1,{1,1,cco1{-1,0, -1,1438081612000,70, 0, 0},cbax[{"OnPeakAccountID", 1800, 997699, 1970-01-01 07:00:00, 0}, {"FreeUnits", 1800, 997699, 1970-01-01 07:00:00, 0}]})

替換后:
(1,1,{1,1,cco1(-1|0| -1|1438081612000|70| 0| 0),cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)]})



   
作者: bt21cnzy21st    時間: 2015-08-31 19:23
回復(fù) 7# Herowinter

謝謝在百忙之中看我的問題


現(xiàn)在我要的最終效果是如下,其中只替換有cco1和cbax后的部分,其他不管

原文:
(1,1,{1,1,cco1{-1,0, -1,1438081612000,70, 0, 0},cbax[{"OnPeakAccountID", 1800, 997699, 1970-01-01 07:00:00, 0}, {"FreeUnits", 1800, 997699, 1970-01-01 07:00:00, 0}]})

替換后:
(1,1,{1,1,cco1(-1|0| -1|1438081612000|70| 0| 0),cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)]})



   
作者: bt21cnzy21st    時間: 2015-08-31 19:28
回復(fù) 6# rulebook

感謝回復(fù),

現(xiàn)在我想要的最終效果是如下,其中只替換有cco1和cbax后的部分,其他不管

原文:
(1,1,{1,1,cco1{-1,0, -1,1438081612000,70, 0, 0},cbax[{"OnPeakAccountID", 1800, 997699, 1970-01-01 07:00:00, 0}, {"FreeUnits", 1800, 997699, 1970-01-01 07:00:00, 0}]})

替換后:
(1,1,{1,1,cco1(-1|0| -1|1438081612000|70| 0| 0),cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)]})



   
作者: bt21cnzy21st    時間: 2015-08-31 19:33
up,這個論壇的人氣還挺旺的
作者: Herowinter    時間: 2015-08-31 20:34
本帖最后由 Herowinter 于 2015-08-31 20:35 編輯

回復(fù) 11# bt21cnzy21st

這樣可以,但是...

  1. awk 'match($0,/cco1\{[^}]*\}/){s1=substr($0,1,RSTART-1);s2=substr($0,RSTART,RLENGTH);s3=substr($0,RSTART+RLENGTH);sub(/{/,"(",s2);sub(/}/,")",s2);gsub(/,/,"|",s2);$0=s1""s2""s3} match($0,/cbax\[[^]]*\]/){s1=substr($0,1,RSTART-1);s2=substr($0,RSTART,RLENGTH);s3=substr($0,RSTART+RLENGTH);gsub(/{/,"(",s2);gsub(/}/,")",s2);gsub(/,/,"|",s2);$0=s1""s2""s3}1' urfile
  2. (1,1,{1,1,cco1(-1|0| -1|1438081612000|70| 0| 0),cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)]})
復(fù)制代碼

作者: haooooaaa    時間: 2015-08-31 20:41
本帖最后由 haooooaaa 于 2015-08-31 21:03 編輯
  1. $ awk '{patsplit($0,t,"(cco1{[^}]*}|cbax\\[[^\\]]*\\])",m);for(i=1;i<length(m);i++){gsub(",","|",t[i]);gsub("{","(",t[i]);gsub("}",")",t[i]);s=s""t[i]""m[i]}print m[0]""s""m[length(m)];s=b}' FILE
  2. (1,1,{1,1,cco1(-1|0| -1|1438081612000|70| 0| 0),cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)]})
復(fù)制代碼

作者: substr函數(shù)    時間: 2015-08-31 20:49
回復(fù) 1# bt21cnzy21st

大神,我想戰(zhàn)個痛快。
不過可惜,
看不懂題目,
被迫放棄不玩了。

作者: bt21cnzy21st    時間: 2015-08-31 20:52
回復(fù) 15# haooooaaa

謝謝,但patsplit' 函數(shù)好像沒定義在我的版本上,報錯如下,能換個方式嗎

function `patsplit' not defined


   
作者: bt21cnzy21st    時間: 2015-08-31 20:54
回復(fù) 14# Herowinter

看得有點暈了, 這么長, 感覺閣下欲言又止的樣子, 能否說說思路


   
作者: Herowinter    時間: 2015-08-31 21:09
回復(fù) 18# bt21cnzy21st

笨辦法, 不大滿意自己的代碼而已, 結(jié)果正確嗎?
   
作者: bt21cnzy21st    時間: 2015-08-31 21:13
大蝦, 這個腳本針對特定的這個能轉(zhuǎn)換,但我多復(fù)制幾個cbax ,cco1就不行了啊, 測試文本如下:

(1,1,{1,1,cco1{-1,0, -1,1438081612000,70, 0, 0},cbax[{"OnPeakAccountID", 1800, 997699, 1970-01-01 07:00:00, 0}, {"FreeUnits", 1800, 997699, 1970-01-01 07:00:00, 0}],cbax[{"OnPeakAccountID", 1800, 997699, 1970-01-01 07:00:00, 0}, {"FreeUnits", 1800, 997699, 1970-01-01 07:00:00, 0}],cco1{-1,0, -1,1438081612000,70, 0, 0}})


回復(fù) 14# Herowinter


   
作者: bt21cnzy21st    時間: 2015-08-31 21:16
大蝦, 這個腳本針對特定的這個能轉(zhuǎn)換,但我多復(fù)制幾個cbax ,cco1就不行了啊, 測試文本如下,我的實際情況是文件中有很多cbax 和cc01標識,也有可能有其他標識,這里我只是把問題簡化了

(1,1,{1,1,cco1{-1,0, -1,1438081612000,70, 0, 0},cbax[{"OnPeakAccountID", 1800, 997699, 1970-01-01 07:00:00, 0}, {"FreeUnits", 1800, 997699, 1970-01-01 07:00:00, 0}],cbax[{"OnPeakAccountID", 1800, 997699, 1970-01-01 07:00:00, 0}, {"FreeUnits", 1800, 997699, 1970-01-01 07:00:00, 0}],cco1{-1,0, -1,1438081612000,70, 0, 0}})

回復(fù) 19# Herowinter


   
作者: bt21cnzy21st    時間: 2015-08-31 21:26
華麗的分割線。。。。。。。。。。。。。
作者: MMMIX    時間: 2015-08-31 22:17
回復(fù) 21# bt21cnzy21st


    直接把你的真實數(shù)據(jù)拿出來吧,像這樣擠牙膏似的一會一改需求算是怎么回事?
作者: jason680    時間: 2015-08-31 22:45
本帖最后由 jason680 于 2015-08-31 22:45 編輯

回復(fù) 9# bt21cnzy21st

看起來是一樣的問題...
解決方法也一樣...

$ perl -pe '{s/cco1[{](.+?)[}]/$x=$1;$x=~y:,:|:;"cco1($x)"/ge;s/cbax\[(.+?)\]/$x=$1;$x=~y:{,}:(|):;"cbax[$x]"/ge}' FILE
(1,1,{1,1,cco1(-1|0| -1|1438081612000|70| 0| 0),cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)]})

$ perl -pe '{s/cco1[{](.+?)[}]/$x=$1;$x=~y:,:|:;"cco1($x)"/ge;s/cbax\[(.+?)\]/$x=$1;$x=~y:{,}:(|):;"cbax[$x]"/ge}' FILEx
(1,1,{1,1,cco1(-1|0| -1|1438081612000|70| 0| 0),cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)],cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)],cco1(-1|0| -1|1438081612000|70| 0| 0)})

   
作者: Herowinter    時間: 2015-08-31 23:01
回復(fù) 21# bt21cnzy21st


希望這次可以了。。。

  1. awk '{while(match($0,/cco1\{[^}]*\}/) || match($0,/cbax\[\{[^]]*\]/)){s1=substr($0,1,RSTART-1);s2=substr($0,RSTART,RLENGTH);s3=substr($0,RSTART+RLENGTH);gsub(/{/,"(",s2);gsub(/}/,")",s2);gsub(/,/,"|",s2);$0=s1""s2""s3}}1' urfile

  2. (1,1,{1,1,cco1(-1|0| -1|1438081612000|70| 0| 0),cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)],cbax[("OnPeakAccountID"| 1800| 997699| 1970-01-01 07:00:00| 0)| ("FreeUnits"| 1800| 997699| 1970-01-01 07:00:00| 0)],cco1(-1|0| -1|1438081612000|70| 0| 0)})
復(fù)制代碼

作者: bt21cnzy21st    時間: 2015-08-31 23:07
十分感謝jason680, 明天我打算做個整體的測試,我會反饋結(jié)果的。

回復(fù) 24# jason680


   
作者: rulebook    時間: 2015-09-01 18:32
回復(fù) 12# bt21cnzy21st
  1. awk 'BEGIN{RS="cco1{[^}]+}|cbax[^]]+]"}{gsub(/,/,"|",RT);gsub(/{/,"(",RT);gsub(/}/,")",RT);print $0,RT}'|sed '{:1;N;$!b1; s/\n//g}'
復(fù)制代碼
try
作者: bt21cnzy21st    時間: 2015-09-02 13:45
感謝jason680 ,這個代碼是沒問題的,符合我的需求,而且很簡練,贊一個。
回復(fù) 24# jason680


   
作者: bt21cnzy21st    時間: 2015-09-02 13:49
經(jīng)測試,你的代碼是正確的, 十分感謝。贊一個

回復(fù) 25# Herowinter


   
作者: bt21cnzy21st    時間: 2015-09-02 13:53
論壇有很多熱心的朋友,不同的朋友給出了不同的答案 ,感謝大家,這里氛圍很好,在此學(xué)到不少東西




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2