如果变量的 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
复杂
因为你的词是“复杂的”或者你想要一个模式,你将需要正则表达式:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
- https://linuxconfig.org/advanced-bash-regex-with-examples
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
我有这个变量:
>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
例如:
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
复杂
因为你的词是“复杂的”或者你想要一个模式,你将需要正则表达式:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
- https://linuxconfig.org/advanced-bash-regex-with-examples
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