14

BASH で文字列のドット数を数えるにはどうすればよいですか? 例えば

VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"

# Variable VAR contains 5 dots
4

6 に答える 6

17

grepwcコマンドを組み合わせて実行できます。

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 "\."
于 2012-08-14T13:32:23.310 に答える
7

awk別:

echo "$VAR" | awk -F. '{ print NF - 1 }'

出力:

5
于 2012-08-15T10:31:30.457 に答える
7
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ます。

于 2012-08-14T13:23:43.443 に答える
6

純粋なソリューション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}
于 2012-08-14T13:45:20.397 に答える
2

一時的に設定IFS、純粋な Bash、サブプロセスなし:

IFS=. VARTMP=(X${VAR}X) # avoid stripping dots
echo $(( ${#VARTMP[@]} - 1 ))

出力:

5
于 2012-10-20T23:55:28.633 に答える
1
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ます。

于 2012-08-14T14:06:21.933 に答える