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]
表示匹配字符t
、y
、p
、e
、A
、\
、[=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。
我的正则表达式有问题,因为我必须接受 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]
表示匹配字符t
、y
、p
、e
、A
、\
、[=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。