Unix 正则表达式中的多个值 - 多个子字符串可能成为表达式的字符串

Multiple values in a regular expression in Unix - Multiple substrings possibles into a string of a expression

我的正则表达式有问题,因为我必须接受 Unix 中某些文件的多个可能值。如果模式匹配是案例 A,否则是案例 B。即:

echo a | grep "^[a\|b\|c]$"
echo a | grep "^[b\|a\|c]$"
echo b | grep "^[a\|b\|c]$"
echo c | grep "^[a\|b\|c]$"

echo typeA | grep "^[typeA\|typeB]$"
echo typeA | grep "^[typeA\|typeB\|c]$"
echo typeA | grep "^[typeA\|typeB]$"
echo typeA | grep "^[typeA\|typeB]$"

通过这些示例,我得到以下输出

a
a
b
c

(empty)
(empty)
(empty)
(empty)

我真的不知道为什么在第5、6、7、8种情况下,我没有得到答案。

"Original code":

ls *.CTL > $ArchivosControl
for i in $(cat $ArchivosControl); do
    pattern=`echo $i | grep '^fixedvalues[0-9]\{7\}_[OptionA1\|OptionA2\|OptionA3]_fixedvalues_[OptionB1\|OptionB2]\.CTL$'`
    if [ "$pattern" != "" ]; then
        Cantidad_Control=$((Cantidad_Control+1))
        echo $pattern >> $List
    else
        echo "It doesn't match for $i"
    fi
done

编辑 2016-10-13 20:30

kennytm 的答案在 Linux:

echo t | grep "^[typeA\|typeB]$"

但我需要它在 Unix 服务器(特别是 AIX)中工作

echo P_typeA_123 | grep "^P_(typeA\|typeB)_[0-9]\{3\}$"

可选文本是我需要验证的主要表达式。

编辑 2016-10-14 14:52

在字符串的最后,我想搜索是否存在 'C' 或 'H'。我应该使用 () 还是 []。即:

echo P_typeA_123N | grep -E "^P_(typeA\|typeB)_[0-9]\{3\}[N|H]$"
echo P_typeA_123N | grep -E "^P_(typeA\|typeB)_[0-9]\{3\}(N|H)$"

我已经证明了两个选项,但我不能选择一个。

PD:'grep -E' 等于 'egrep'?我找不到区别。

你用错了括号。

$ #                   ↓↓            ↓↓
$ echo typeA | grep "^\(typeA\|typeB\)$"
typeA

[]用于构造字符类。 [typeA\|typeB]表示匹配字符typeA\、[=20中的一个字符=],等等

$ echo t | grep "^[typeA\|typeB]$"
t

你要的是分组,在基本正则表达式语法中用\( … \)表示。

将您的行更改为以下内容:

echo typeB | egrep "^typeA|typeB$"

方括号一般表示一个字符集,而不是整个模式。所以:

grep '^[abc]$'

将匹配完全仅由一个 a、b 或 c 组成的任何行。

OTOH:

egrep '^(abc|def)$'

...将完全匹配 'abc' 行或 'def' 行,仅此而已。

只有扩展的正则表达式支持交替(这是 | 所做的),因此请使用 egrep 而不是 grep。另见 alternation ref