【问题标题】:Multiple values in a regular expression in Unix - Multiple substrings possibles into a string of a expressionUnix中正则表达式中的多个值 - 表达式的字符串中可能有多个子字符串
【发布时间】:2016-12-29 14:01:18
【问题描述】:

我遇到了正则表达式的问题,因为我必须接受 Unix 中某些文件的多个可能值。如果模式匹配是Case A,否则是Case 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 中,我没有得到答案。

“原码”:

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'?我找不到区别。

【问题讨论】:

    标签: regex shell unix grep aix


    【解决方案1】:

    你使用了错误的括号。

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

    [] 用于构造字符类。 [typeA\|typeB] 表示匹配typeA\|等字符之一。

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

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

    【讨论】:

    • BRE 中的所有元字符是否都已转义,而对于字面量则没有转义?
    • @sln No、[].*^$ 是特殊的。 \(\)\{\} 需要转义。 \?\+\| 实际上不是 BRE 的一部分,但 Linux 和 OS X 上的 grep 都支持它。
    • 它在 Linux 服务器上运行良好,我如何在 Unix 服务器上做到这一点?
    • @Angel:我的答案使用\( ... \),而不是[ ... ] ?
    • 我复制了之前的代码,但我用 (...) 证明了正确的代码,对不起
    【解决方案2】:

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

    echo typeB | egrep "^typeA|typeB$"
    

    【讨论】:

    • 请参阅我编辑的部分,因为我修改了我的问题以更好地解释我的情况。我需要一个包含三个可能值的表达式到我的正则表达式中,需要其他模式
    【解决方案3】:

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

    grep '^[abc]$'

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

    奥托:

    egrep '^(abc|def)$'

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

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

    【讨论】:

    • 请参阅我编辑的部分,因为我修改了我的问题以更好地解释我的情况。我需要一个包含三个可能值的表达式到我的正则表达式中,这需要其他模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 2011-02-17
    • 2019-03-03
    • 2017-10-07
    相关资源
    最近更新 更多