AWK 使用正则表达式验证字段

问题描述 投票:0回答:1

我正在尝试定义一个正确的正则表达式来验证字段。

该字段长度为 26 个字符,可以包含:任何字母(小写或大写)、空格 ( )、逗号 (,)、连字符 (-) 或正斜杠 (/)。

我尝试了几种组合,但仍然没有得到我需要的结果。我需要该程序来评估该字段是否符合正则表达式规则,如果不符合,我需要它向我显示不符合的字符。

这就是我得到的:

awk '
   function showChars(fieldIn) {
      split(fieldIn,chars,"")
      for ( i=1; i<=length(chars)+1; i++ ) {
         if (chars[i] !~ regex) {
            print "Invalid char found:" chars[i]
         }
      }
   }

   BEGIN {
      FS=""
      FIELDWIDTHS="4 4 26"
      regex="([a-zA-Z]*)|([\-|\s|\/|\,]*)"
   }

   {
      if ( $3 !~ /regex/ ) {
         print "Line " NR ": Problem in field"
         print "$3:"$3
         showChars($3)
         next
      } else {
         print "Line " NR ": OK"
         next
      }
   }
' $filename

此特定代码输入 if,但 then 不打印任何字符。 已尝试了许多其他正则表达式组合:转义元字符、不转义它们、使用/不使用 |、使用/不使用 []、复制粘贴 26x 而不是 * 等。

输入文件名示例: !!!!----JOHN,DOE/-SMITH $*(4+4+26 个字符字段后的文件结尾)

该计划应该:

  1. 通过 if ( $3 !~ /regex/ ) 判断字段 $3 中是否存在不正确的字符。
  2. 如果是这种情况,请通过 showChars() 函数显示不正确的字符(在本例中:$ 和 *)。
regex awk expression
1个回答
0
投票

这可能是您正在尝试做的,未经测试的,使用 GNU 进行多个扩展:

awk '
   function showchar(fieldIn,   chars,numChars,i) {
      numChars = split(fieldIn,chars,"")
      for ( i=1; i <= numChars; i++ ) {
         if ( chars[i] !~ chrRegex ) {
            print "Invalid char found:" chars[i]
         }
      }
   }

   BEGIN {
      FIELDWIDTHS="4 4 26"
      chrRegex = "[[:alpha:][:space:],/-]"
      fldRegex = "^(" chrRegex "){26}$"
   }

   {
      if ( $3 ~ fldRegex ) {
         print "Line " NR ": OK"
      }
      else {
         print "Line " NR ": Problem in field"
         print "$3:"$3
         showchar($3)
      }
   }
' "$filename"

您的

showchar
功能可能只是:

function showchar(fieldIn) {
    print "Invalid char(s) found:" gensub(chrRegex,"","g",fieldIn)
}
© www.soinside.com 2019 - 2024. All rights reserved.