借助此question,我可以找出一个字符串是否包含特定字符。我希望能够找出角色的实际位置。例如,对于字符串banana
,我如何确定字母n
是第3和第5个字母,或者字母a
是第2,第4和第6个字母。 b
是第一个字母。
问:对于给定的字符串,如何在该字符串中找到给定字符的位置?
答案 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引入的。