如何查找字符串中特定字符的位置

时间:2016-01-22 03:18:27

标签: string bash

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

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

3 个答案:

答案 0 :(得分: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}使用bash的子字符串运算符提取字符串的i字符,如Shell Parameter Expansion中所述:

  

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

答案 1 :(得分: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

答案 2 :(得分: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

我们的想法是,我们遍历字符串,将字符位置添加到字符串中,这些字符串是数组中的值,其下标是您感兴趣的字母。它是快速的&amp;很简单,并为您提供一个可以在之后操作的结果集,而不仅仅是将内容发送到stdout。

我的结果是:

$ ./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引入的。