2013-08-27 53 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,它是一个强大的(如果相当笨拙的)工具。 –