0

我正在尝试检查长度为 1 的字符串是否只有以下字符:[RGWBO]。

我正在尝试以下但它不起作用,我错过了什么?

if [[ !(${line[4]} =~ [RGWBO]) ]];
4

4 回答 4

2

这就是你想要的:

if [[ ${line[4]} =~ ^[RGWBO]+$ ]];

这意味着从开始到结束的字符串必须有 [RGWBO] 字符一次或多次。

如果你想否定表达式,只需!在前面使用[[ ]]

if ! [[ ${line[4]} =~ ^[RGWBO]+$ ]];

或者

if [[ ! ${line[4]} =~ ^[RGWBO]+$ ]];
于 2013-09-08T14:19:57.517 回答
1

这适用于任何可用的 Bash 版本:

[[ -n ${LINE[0]} && ${LINE[0]} != *[^RGWB0]* ]]

尽管我更喜欢扩展 glob 的简单性:

shopt -s extglob
[[ ${LINE[0]} == +([RGWBO]) ]]
于 2013-09-08T14:50:16.680 回答
0

方法

  1. 用 测试字符串长度${#myString},如果等于 1 则继续步骤 2;
  2. 是否包含您的模式。

代码

re='[RGWBO]'; 
while read -r line; do
  if (( ${#line} == 1 )) && [[ $line == $re ]]; then
    echo "yes: $line"
  else 
    echo "no: $line" 
  fi
done < test.txt

资源

您可能想查看以下链接:

数据

test.txt文件包含这个

RGWBO
RGWB
RGW
RG
R
G
W
B
O
V
于 2013-09-08T14:17:51.247 回答
0

使用expr(表达式求值器) 进行子串匹配

#!/bin/bash
pattern='[R|G|W|B|O]'
string=line[4]
res=`expr match "$string" $pattern`

if [ "${res}" -eq "1" ]; then
  echo 'match'
else
  echo 'doesnt match'
fi
于 2013-09-08T14:19:39.303 回答