【发布时间】:2012-08-10 19:07:31
【问题描述】:
如何在 BASH 中计算字符串中的点数?例如
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
# Variable VAR contains 5 dots
【问题讨论】:
标签: bash
如何在 BASH 中计算字符串中的点数?例如
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
# Variable VAR contains 5 dots
【问题讨论】:
标签: bash
您可以结合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 "\."
【讨论】:
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 计算结果长度。
【讨论】:
awk 替代:
echo "$VAR" | awk -F. '{ print NF - 1 }'
输出:
5
【讨论】:
纯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}
【讨论】:
DOTS=${VAR_TMP//[^.]}; echo ${#DOTS}。
临时设置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 )) )
这可以通过将字段分隔符设置为“。”来实现。在子shell中并通过对字符串进行分词来设置位置参数。有 N 个点,就会有 N+1 个位置参数。最后,我们从 subshell 中的位置参数数量中减去 1,并在 dot_count 中回显要捕获的参数。
【讨论】: