如果变量的 WORD 重复不止一次则匹配

Match if variable has WORD repeated more than once

我有这个变量:

>echo $br_name
srxa wan-a1 br-wan3-xa1 0A:AA:DD:C1:F1:A3 ge-0.0.3 srxa wan-a2 br-wan3-xa2 0A:AA:DD:C1:F2:A3 ge-0.0.3

我正在尝试创建一个条件,它检测 ge-0.0.3 在我的变量 $br_name

中是否重复超过 1 次

例如:

if [[ $br_name has ge-0.0.3 repeated more than one time ]]
then
    echo "ge-0.0.3 is shown more than once"
else
    :
fi

简单的单词

如果你的词是“简单的”,你可以用以下方法检测出现次数:

echo "123 123 123" | sed "s/123 /123\n/g" | wc -l

其中的单词被替换为 \n 然后 wc 计算行数

或者您可以尝试以下方法之一:

  • Count occurrences of a char in a string using Bash
  • How to count number of words from String using shell

复杂

因为你的词是“复杂的”或者你想要一个模式,你将需要正则表达式:

script.sh

count=0

for word in ; do
  if [[ "$word" =~ .*ge-0\.0\.3.* ]]
  then
    count=$(($count+1))
  fi
done

if [ "$count" -gt "1" ];
then
  echo "ge-0.0.3 is shown more than once"
else
  if [ "$count" -eq "0" ];
  then
    echo "ge-0.0.3 is not shown"
  else
    echo "ge-0.0.3 is shown once"
  fi
fi

执行

bash script.sh "srxa wan-a1 br-wan3-xa1 0A:AA:DD:C1:F1:A3 ge-0.0.3 srxa wan-a2 br-wan3-xa2 0A:AA:DD:C1:F2:A3 ge-0.0.3"

grep

使用 grep 可以获取出现次数

ocurrences=( $(grep -oE '(ge-0\.0\.3)' <<<) )
ocurrences_count=${#ocurrences[*]}
echo $ocurrences_count

您可以使用 grep -o 只打印匹配的短语。还使用 -F 确保它匹配文字字符而不是正则表达式,其中 .- 是特殊的

if [[ $(echo "$br_name" | grep -Fo ge-0.0.3 | wc -l) -gt 1 ]]; then
    echo "ge-0.0.3 is shown more than once"
else
    echo "only once"
fi

当然,对于更复杂的模式,您可以删除 -F 并为 grep

编写适当的正则表达式

Bash 的 =~ 正在使用扩展 RE。

[Bash-5.2] % check() { local s='(ge-0\.0\.3.*){2,}'; [[ "" =~ $s ]] && echo yes || echo no; }
[Bash-5.2] % check 'xxx'
no
[Bash-5.2] % check 'ge-0.0.3'
no
[Bash-5.2] % check 'ge-0.0.3 ge-0.0.3 '
yes
[Bash-5.2] % check 'ge-0.0.3 ge-0.0.3 ge-0.0.3 '
yes

假设您想对整个单词而不是子字符串进行文字字符串匹配,那么这可能就是您想要的:

$ if (( $(grep -oFw 'ge-0.0.3' <<<"$br_name" | wc -l) > 1 )); then echo 'yes'; else echo 'no'; fi
yes