如何使用正则表达式测试awk中的变量?

0 awk

我想测试脚本参数是否仅由字母组成。这是脚本:

 BEGIN {
        VALUE=ARGV[1];
        if (VALUE ~ /[A-Za-z]/) {
           print VALUE " : Ok only letters";
        }
        print VALUE;
}
Run Code Online (Sandbox Code Playgroud)

似乎它匹配每个字符串至少有一个字母:

tchupy@rasp:~$ awk -f s.awk file 111
value = 111
tchupy@rasp:~$ awk -f s.awk file  @@@
value = @@@
tchupy@rasp:~$ awk -f s.awk file  aaa
aaa : Ok only letters
value = aaa
tchupy@rasp:~$ awk -f s.awk file  1a1
1a1 : Ok only letters
value = 1a1
tchupy@rasp:~$ awk -f s.awk file  a1a
a1a : Ok only letters
value = a1a
tchupy@rasp:~$ awk -f s.awk file  1@1
value = 1@1
Run Code Online (Sandbox Code Playgroud)

我尝试使用match()函数,但是当我尝试使用 [A-Za-z] 正则表达式时,在 [ 处或附近出现语法错误

谢谢

ter*_*don 5

如果变量包含至少一个来自您的字符类的字符,则您的测试为真。要测试变量是否包含字符类中的字符,您需要从^脚本的开头 ( ) 到结尾进行匹配:

BEGIN {
    VALUE=ARGV[1];
    if (VALUE ~ /^[A-Za-z]+$/) {
       print VALUE " : Ok only letters";
    }
    print VALUE;
}
Run Code Online (Sandbox Code Playgroud)

或者更简洁:

BEGIN {
    print ARGV[1] ": " (ARGV[1] ~ /^[A-Za-z]+$/ ? "OK" : "BAD")
}
Run Code Online (Sandbox Code Playgroud)

  • 或者使用“[^A-Za-z]”进行反向测试以测试单个非字母。 (5认同)
  • @Kusalananda,至少用gawk,不构成有效字符一部分的字节既不匹配`[A-Za-z]`也不匹配`[^A-Za-z]`,比较`awk'BEGIN{if( ARGV[1] ~ /^[A-Za-z]+$/) 用 `awk 'BEGIN{if (ARGV[1] !~ /[^A] 打印 "ok"}' $'\200\200'` -Za-z]/) 例如,在 UTF-8 语言环境中打印 "ok"}' $'\200\200'`。(还有空字符串的特殊情况) (2认同)
  • `[A-Za-z]` 匹配的字符列表也将随语言环境、操作系统、`awk` 实现及其版本的不同而有很大差异。 (2认同)