BASH脚本正则表达式:小于或等于X位数

时间:2014-03-27 05:57:42

标签: regex bash

我想匹配小于或等于 2位数但不超过 2位数的字符串。如果数字不连续,则总数可能超过2位,但每个连续数字最多应为2个字母。

所以,我想匹配像

这样的字符串
42
ABC92
05XYZ
ABC82XYZ
()%^.90 XYZ
AB 47.jpg
3
83abc29
9abw88ak ak8+

但不是

426
ABC9242
05697XYZ
ABC8232XYZ
()%^.9068 XYZ
AB 479.jpg
483 a8

数字之前或之后的字母不仅可以是字母,还可以是任何不是数字的字符(数字之前或之后没有字母,这些字符串应该匹配,太)。

.*[[:digit:]]{1,2}.*也会匹配超过2位数的字符串。这不是我想要的。

我该怎么做?

1 个答案:

答案 0 :(得分:5)

仅使用bash。而不是试图找到少于3位的任何数字,找到匹配3位或更多数字的任何内容并将其排除:

while read -r line; do
  [[ "$line" =~ [[:digit:]][[:digit:]][[:digit:]] ]] || echo "$line"
done << EOF
42
ABC92
05XYZ
ABC82XYZ
()%^.90 XYZ
AB 47.jpg
426
ABC9242
05697XYZ
ABC8232XYZ
()%^.9068 XYZ
AB 479.jpg
EOF

产地:

42
ABC92
05XYZ
ABC82XYZ
()%^.90 XYZ
AB 47.jpg

说明:binary operator =~将RHS视为扩展正则表达式。它匹配包含3位数(或更多)的任何内容。 ||是一个短路运营商:

expression1 || expression2

这意味着expression2仅在expresssion1为假时执行。

因此,仅打印不包含3个或更多连续数字的行。


您也可以使用grep使用标志来启用扩展正则表达式或PCRE:

grep -vE '[0-9]{3,}' inputfile

grep -vP '[0-9]{3,}' inputfile