Bash - 正则表达式匹配数字元组

Bash - 正则表达式匹配数字元组

我想检查通过 read 命令写入 bash 变量的字符串是否是两个数字的元组。据我所知,这应该可以通过

if [[ "$input" =~ "$regex" ]]; then ...

对于由两个数字组成的元组,至少由一个空格分隔,并且前后有任意数量的空格,我尝试过

$regex="^ *[0-9]+ +[0-9]+ *$"

哪个应该匹配

12 123
  23 3246543
123     345     
     34      23
1 234

但不是

123 123 123
1235124
123w123 123
etc.

然而,这不起作用......

答案1

POSIXshell 脚本函数,使用参数扩展来获取第一个和第二个数字,-eq仅当有两个参数均为相同数字时才会成功(如果参数较少或较多,或者如果有包含字母,则失败),并!=检查空格。退货真的仅当它是两个数字元组时:

is_tup() { [ ${1% *} -eq ${1% *} -a \ 
             ${1#* } -eq ${1#* } -a "${1% *}" != "$1" ] 2> /dev/null ; }

测试:

echo '12 123
  23 3246543
123     345     
     34      23
1 234
123 123 123
1235124
123w123 123' | 
while read x ; do is_tup "$x" && a=yes || a=no ; printf '%s\t%s\n' $a "$x" ; done

输出:

yes 12 123
yes 23 3246543
yes 123     345
yes 34      23
yes 1 234
no  123 123 123
no  1235124
no  123w123 123

相关内容