借助此question,我可以找出字符串是否包含特定字符。我希望能够找出角色的实际位置。例如对于字符串banana
,我如何能够确定字母n
是第3个字母还是第5个字母,或者是字母a
是第2,4和6个字母。和b
是第一个字母。如何找到字符串中特定字符的位置
问:对于给定的字符串,我如何找到给定字符在该字符串中的位置?
借助此question,我可以找出字符串是否包含特定字符。我希望能够找出角色的实际位置。例如对于字符串banana
,我如何能够确定字母n
是第3个字母还是第5个字母,或者是字母a
是第2,4和6个字母。和b
是第一个字母。如何找到字符串中特定字符的位置
问:对于给定的字符串,我如何找到给定字符在该字符串中的位置?
你可以用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}
这被称为子串扩展。它扩展到length
parameter
的字符值从offset
指定的字符开始。
这里做一个奇特的方式:
#!/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
这里是我拿到这个:
#!/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
我想不出比一个循环,测试每个字符以外的任何更简单的方法介绍。 – Barmar
看看这个链接:http://superuser.com/questions/434507/how-to-find-the-index-of-a-word-in-a-string-in-bash。希望它能帮助你。 – Renien