【问题标题】:How to find the location(s) of specific characters in a string如何在字符串中查找特定字符的位置
【发布时间】:2016-01-22 12:54:44
【问题描述】:

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

问:对于给定的字符串,我怎样才能找到给定字符在该字符串中的位置?

【问题讨论】:

标签: string bash


【解决方案1】:

您可以使用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}
这称为子字符串扩展。它从offset 指定的字符开始,最多扩展到parameter 的值的length 个字符。

【讨论】:

  • 任何解释${string:$i:1}做什么的机会
  • 我已经添加了解释,包括您自己可以阅读的文档。
【解决方案2】:

这是一个很好的方法:

#!/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

【讨论】:

    【解决方案3】:

    这是我的看法:

    #!/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 中引入的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 2019-05-31
      • 2021-12-22
      • 1970-01-01
      • 2012-12-24
      相关资源
      最近更新 更多