posix sh:如何在不使用外部工具的情况下计算字符串中出现的次数?

时间:2018-04-09 17:06:07

标签: sh posix

在bash中,可以这样做:

#!/bin/bash

query='bengal'
string_to_search='bengal,toyger,bengal,persian,bengal'

delimiter='|'

replace_queries="${string_to_search//"$query"/"$delimiter"}"

delimiter_count="${replace_queries//[^"$delimiter"]}"
delimiter_count="${#delimiter_count}"

echo "Found $delimiter_count occurences of \"$query\""

输出:

Found 3 occurences of "bengal"

当然需要注意的是,分隔符不能出现在“查询”中。或者' string_to_search'。

在POSIX sh中,不支持字符串替换。有没有办法只使用shell内置函数在POSIX sh中完成?

2 个答案:

答案 0 :(得分:0)

想想我明白了......

#!/bin/sh

query='bengal'
string_to_search='bengal,toyger,bengal,persian,bengal'

i=0
process_string="$string_to_search"
while [ -n "$process_string" ]; do
    case "$process_string" in
        *"$query"*)
            process_string="${process_string#*"$query"}"
            i="$(( i + 1 ))"
            ;;
        *)
            break
            ;;
    esac
done

echo "Found $i occurences of \"$query\""

答案 1 :(得分:0)

#!/bin/sh

query='bengal'
string_to_search='bengal,toyger,bengal,persian,bengal'

ct() (
        n=0
        IFS=,
        q=$1
        set $2
        for t in "$@"; do
                if [ "$t" = "$q" ]; then
                        n=$((n + 1))
                fi
        done
        echo $n
)

n=$(ct "$query" "$string_to_search")
printf "found %d %s\n" $n $query

虽然我不确定这是什么意思。如果你有一个posix shell, 你几乎肯定也有printf,sed,grep和wc。

printf '%s\n' "$string_to_search" | sed -e 's/,/\n/g' | grep -Fx "$query" | wc -l