2013-08-27 55 views
0

一個雙引號的字符串在雙引號字符串"$consC"用空格和*的,看起來像這樣:獲得*的指數在猛砸OS X

          * **** *****  

如何獲得每個指數*的?

+2

http://mywiki.wooledge.org/XyProblem –

回答

1

使用蠻力,無知和bash(4.x或3.x的 - 但如果它被調用爲/bin/shsh - 我的頭很痛打壓它反對sh磚牆後),你可以嘗試:

$ for i in $(seq 0 ${#consC}); do [ "${consC:$i:1}" = "*" ] && echo "$i [${consC:$i:1}]"; done 
44 [*] 
46 [*] 
47 [*] 
48 [*] 
49 [*] 
51 [*] 
52 [*] 
53 [*] 
54 [*] 
55 [*] 
$ 

您可以用改進:​​,不超調數組的結束,而是顯得更加簡潔高深莫測 - Perl的吃你的心臟了!

我希望有更好的方法。

(顯然,這取決於你到底如何設置consC,你可能會在輸出中獲得略有不同的數字。)

注:這是在Mac OS X 10.8.4測試,但我有一個自制bash 4.2可用(儘管我大多數時候使用bash 3.2.48 - 因此頭痛)。如果你不能使用bash,只提供sh,您需要與"$(expr "$consC" : '^.\{'"$i"'\}\(.\)')"更換"${consC:$i:1}"

$ for i in $(seq 0 ${#consC}); do [ "$(expr "$consC" : '^.\{'"$i"'\}\(.\)')" = '*' ] && echo $i; done 
44 
46 
47 
48 
49 
51 
52 
53 
54 
55 
$ 

或者使用[[運營商和少兩個雙引號:

$ for i in $(seq 0 ${#consC}); do [[ $(expr "$consC" : '^.\{'"$i"'\}\(.\)') = '*' ]] && echo $i; done 
44 
46 
47 
48 
49 
51 
52 
53 
54 
55 
$ 

[ ...由於各種原因可以追溯到史前,我的殼被淹沒到/bin/sh,即使我認爲我沒有將它運行/bin/bash ......我現在已經修復了這個問題!我跑/bin/bash畢竟...和原來的版本,而expr正常工作與bash 3.2.48]

+0

你能澄清你的問題?表達式'$ {consC:$ i:1}'出現在代碼中;它是從開始位置'$ i'開始的長度爲1的子字符串,因此它是字符串中的第i個字符。但是循環是由'$(seq 0 $ {#consC})'的輸出控制的,它是數字0..56或其附近。 –

+0

第一個工作正常! – user2662478

+0

太棒了;第一種解決方案比使用'expr'更好。這可能是因爲我將'bash' 3.x作爲'sh'仍然運行 - 而不是'bash' - 並且說明了我的頭痛。避免'expr'是生活中的一個很好的總體目標; OTOH,它是一個強大的(如果相當笨拙的)工具。 –