我想匹配小于或等于 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位数的字符串。这不是我想要的。
我该怎么做?
答案 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