亚洲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
[root@66a awk]# cat what.sh
#!/bin/awk
/cco1{/{
sub(/{/,"(");
sub(/}/,")");
gsub(/,/,"|");
print
}
/cbax\[/{
gsub(/{/,"(");
gsub(/}/,")");
gsub(/,/,"|");
print
}
[root@66a awk]# awk -f what.sh file
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ù)制代碼
嚴謹?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
sed -r 's/,/\|/g ;s/\{/\(/ ;s/\}/\)/'
復(fù)制代碼
作者:
Herowinter
時間:
2015-08-31 17:41
回復(fù)
1#
bt21cnzy21st
while read line;do if [[ "$line" =~ "cco1\{[^}]*\}" ]];then echo "$line"|tr "{}," "()|";elif [[ "$line" =~ "cbax\[[^]]*\]" ]];then echo "$line"|tr "{}," "()|";else echo "$line";fi;done<i
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ù)制代碼
作者:
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
這樣可以,但是...
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
(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 編輯
$ 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
(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
希望這次可以了。。。
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
(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
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