Bashを使用して、文字列内の文字の出現回数をカウントする必要があります。
次の例では、charが(たとえば)t
の場合、それはecho
st
でのvar
の正しい出現回数ですが、文字がコンマまたはセミコロンの場合、ゼロを出力します。
var = "text,text,text,text"
num = `expr match $var [,]`
echo "$num"
次のawk
コマンドを使用します。
string="text,text,text,text"
char=","
awk -F"${char}" '{print NF-1}' <<< "${string}"
文字列を$char
で分割し、結果のフィールドの数から1を引いた値を出力します。
シェルが<<<
演算子をサポートしていない場合は、echo
を使用します。
echo "${string}" | awk -F"${char}" '{print NF-1}'
たとえば、次のように、他のすべての文字を削除して、残っているものをカウントできます。
var="text,text,text,text"
res="${var//[^,]}"
echo "$res"
echo "${#res}"
印刷します
,,,
3
または
tr -dc ',' <<<"$var" | awk '{ print length; }'
または
tr -dc ',' <<<"$var" | wc -c #works, but i don't like wc.. ;)
または
awk -F, '{print NF-1}' <<<"$var"
または
grep -o ',' <<<"$var" | grep -c .
または
Perl -nle 'print s/,//g' <<<"$var"
tr
コマンドとwc
コマンドを組み合わせて実行できます。たとえば、文字列e
でreferee
をカウントするには
echo "referee" | tr -cd 'e' | wc -c
出力
4
説明:コマンドtr -cd 'e'
は「e」以外のすべての文字を削除し、コマンドwc -c
は残りの文字をカウントします。
このソリューションには、コマンドcat mytext.txt | tr -cd 'e' | wc -c
がファイルmytext.txt
内のe
をカウントできるなど、複数行の入力も適しています。
サーバーにある場合、awkはうまく機能します。
var="text,text,text,text"
num=$(echo "${var}" | awk -F, '{print NF-1}')
echo "${num}"
みんなの素晴らしい回答とコメントを基に、これは最短で最も甘いバージョンです:
grep -o "$needle" <<< "$haystack" | wc -l
私は以下を提案します:
var="any given string"
N=${#var}
G=${var//g/}
G=${#G}
(( G = N - G ))
echo "$G"
他のプログラムへの呼び出しはありません