BASH で文字列のドット数を数えるにはどうすればよいですか? 例えば
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
# Variable VAR contains 5 dots
BASH で文字列のドット数を数えるにはどうすればよいですか? 例えば
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
# Variable VAR contains 5 dots
grep
とwc
コマンドを組み合わせて実行できます。
echo "string.with.dots." | grep -o "\." | wc -l
説明:
grep -o # will return only matching symbols line/by/line
wc -l # will count number of lines produced by grep
grep
または、その目的にのみ使用できます。
echo "string.with.dots." | grep -o "\." | grep -c "\."
awk
別:
echo "$VAR" | awk -F. '{ print NF - 1 }'
出力:
5
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
echo $VAR | tr -d -c '.' | wc -c
tr-d
は、指定された文字を入力から削除します。-c
指定された文字の逆数を取ります。合わせて、この式は「.」以外を削除します。を使用して結果の長さをカウントしwc
ます。
純粋なソリューションbash
:
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
VAR_TMP="${VAR//\.}" ; echo $((${#VAR} - ${#VAR_TMP}))
または、chepnerが述べたように:
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
VAR_TMP="${VAR//[^.]}" ; echo ${#VAR_TMP}
一時的に設定IFS
、純粋な Bash、サブプロセスなし:
IFS=. VARTMP=(X${VAR}X) # avoid stripping dots
echo $(( ${#VARTMP[@]} - 1 ))
出力:
5
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
dot_count=$( IFS=.; set $VAR; echo $(( $# - 1 )) )
これは、フィールド セパレータを「.」に設定することで機能します。サブシェルで、文字列を単語分割して位置パラメータを設定します。N ドットの場合、N+1 の位置パラメータがあります。最後に、サブシェル内の位置パラメータの数から 1 を引き、それをエコーして でキャプチャしdot_count
ます。