【问题标题】:Counting the number of dots in a string计算字符串中的点数
【发布时间】: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


【解决方案1】:

您可以结合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 "\."

【讨论】:

    【解决方案2】:
    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 计算结果长度。

    【讨论】:

      【解决方案3】:

      awk 替代:

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

      输出:

      5
      

      【讨论】:

        【解决方案4】:

        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}
        【解决方案5】:

        临时设置IFS,纯Bash,无子进程:

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

        输出:

        5
        

        【讨论】:

          【解决方案6】:
          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 个位置参数。最后,我们从 subshel​​l 中的位置参数数量中减去 1,并在 dot_count 中回显要捕获的参数。

          【讨论】:

          • 这将去除前导点和尾随点。
          猜你喜欢
          • 2011-10-21
          • 2018-04-20
          • 1970-01-01
          • 2016-10-28
          • 2018-04-20
          • 1970-01-01
          • 2021-01-24
          • 2017-10-20
          相关资源
          最近更新 更多