2016-01-22 161 views
1

借助此question,我可以找出字符串是否包含特定字符。我希望能够找出角色的实际位置。例如对于字符串banana,我如何能够确定字母n是第3个字母还是第5个字母,或者是字母a是第2,4和6个字母。和b是第一个字母。如何找到字符串中特定字符的位置

问:对于给定的字符串,我如何找到给定字符在该字符串中的位置?

+0

我想不出比一个循环,测试每个字符以外的任何更简单的方法介绍。 – Barmar

+0

看看这个链接:http://superuser.com/questions/434507/how-to-find-the-index-of-a-word-in-a-string-in-bash。希望它能帮助你。 – Renien

回答

2

你可以用for循环来完成。

char=a 
string=banana 
len=${#string} 
for ((i=0; i < len; i++)); do 
    if [[ $char == ${string:$i:1} ]] 
    then echo $i 
    fi 
done 

打印的位置是从零开始的。你可以回显$((i+1))来获得基于1的位置。

${string:$i:1}提取字符串的i个字符,使用bash的子运算符,如Shell Parameter Expansion解释:

${parameter:offset:length}
这被称为子串扩展。它扩展到lengthparameter的字符值从offset指定的字符开始。

+1

任何解释'$ {string:$ i:1}'的机会 – 3kstc

+1

我已经添加了解释,包括你自己可以阅读的文档。 – Barmar

0

这里做一个奇特的方式:

#!/usr/bin/env bash 

findChar(){ 
    string="${1}" 
    char="${2}" 

    length=${#string} 
    offset=0 

    r=() 

    while true; do 
     string="${string#*${char}}" 
     length_new="${#string}" 
     if [[ "${length}" == "${length_new}" ]]; then 
      echo "${r[@]}" 
      return 
     fi 
     offset=($(($offset + $length - $length_new))) 
     r+=("${offset}") 
     length="${length_new}" 
    done 
} 

findChar banana b 
findChar banana a 
0

这里是我拿到这个:

#!/usr/bin/env bash 

[[ ${BASH_VERSINFO[0]} < 4 ]] && { echo "Requires bash 4."; exit 1; } 

string="${1:-banana}" 

declare -A result=() 

for ((i=0; i<${#string}; i++)); do 
    result[${string:$i:1}]="${result[${string:$i:1}]} $i" 
done 

declare -p result 

的想法是,我们通过串走,添加字符位置到字符串是一个数组中的值,其下标是你感兴趣的字母。它很容易,并且给你一个结果集,你可以在之后操作,而不仅仅是把东西发送到标准输出。

我与这个结果是:

$ ./foo 
declare -A result='([a]=" 1 3 5" [b]=" 0" [n]=" 2 4")' 
$ ./foo barber 
declare -A result='([a]=" 1" [b]=" 0 3" [e]=" 4" [r]=" 2 5")' 

结果是从零开始的(即 “b” 为在位置0)。

注意:此方法的一个有趣的副作用是,每一个位置由前面有一个空格,所以如果你要算一个字符出现的次数,你可以算的空间:

$ declare -A result 
$ result[a]=" 1 3 5" 
$ count="${result[a]//[0-9]/}" 
$ echo "${#count}" 
3 
$ 

我不知道你打算如何处理这些数据,但如果你喜欢,你可以很容易地将这些字符串结果转换为自己的数组,以便在bash中更容易处理。

注意关联数组是使用bash版本4

相关问题