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



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

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种情况下,我没有得到答案。

"原始代码"

:

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|等字符之一。

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

您想要的是分组,在基本正则表达式语法中由( … )表示。

将行改为:

echo typeB | egrep "^typeA|typeB$"

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

grep的^ (abc)美元的

将匹配任何只包含一个a、b或c的行。

OTOH:

abc |

egrep ^ (def)美元的

…将完全匹配行'abc'或行'def'。

替代(这就是|所做的)仅由扩展正则表达式支持,因此使用egrep而不是grep。参见参考

最新更新