0

"$consC"在带有空格和's的双引号字符串中*,如下所示:

                                            * **** *****       

如何获取每个*'s 的索引?

4

1 回答 1

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 [*]
$

你可以用 : 来改进它$(seq 0 $((${#consC}-1)) ),它不会超出数组的末端,但更简洁,更难以理解——Perl 吃掉你的心!

我希望有更好的方法。

(显然,根据您设置的具体方式consC,您可能会在输出中得到略有不同的数字。)

注意:这是在 Mac OS X 10.8.4 上测试的,但我有一个自制的bash4.2 可用(尽管我bash大部分时间都使用 3.2.48 - 因此很头疼)。如果您不能使用bash并且只有sh,则需要替换"${consC:$i:1}""$(expr "$consC" : '^.\{'"$i"'\}\(.\)')"

$ 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......并且原始版本没有exprbash3.2.48 上正常工作。]

于 2013-08-27T02:40:16.093 回答