如何使用适当的正则表达式在 awk 中查找模式?

如何使用适当的正则表达式在 awk 中查找模式?

使用下面的示例,我试图找出regex我的awk program.

  • 输出只能是长度不超过 5 的数字:IG15251
  • 输出只能包含两个字母, 5 和“O”之前和之后的"H" & "O"任何数字都是可选的:=< 3=<IGHO722 或 799H89090
  • 输出可以不是包括任何有空格或除数字之外的任何单词:IGHKKS kjsla aaa --> 不可接受

    猫文件名

    00ISM00123
    189902
    078HP890201
    HO90902
    123H7292
    234HO7027
    12345556
    GV18029039
    kslal HOsjlk jj 123
    687iOu7900
    

我尝试了以下脚本

 awk  '$1~/^[0-9]{,3}([hH][oO]?)[^a-zA-Z]/' filename`

但不要覆盖文件名中的数字 IE

>     189902 
>     12345556

当我尝试以下脚本时,输出仍然不正确!

awk  '$1~/^([0-9]{,3}([hH][oO]?)?)[^a-zA-Z]/' filename

任何解释帮助都非常感谢!

答案1

我将其分成两个正则表达式,这看起来正在工作:

cat filename | grep -E '^[0-9]{5}$|^[0-9]{0,3}[hH]{1}[oO]{0,1}[0-9]{0,5}$'

正则表达式的第一部分将尝试仅包含 5 位数字的文件名,第二部分将尝试包含 0-3 位数字、1 个“h”或“H”字母、0 或 1 个“oO”字母、0 到 5 的文件名数字。

这个正则表达式awk也适用于:

cat filename | awk  '/^[0-9]{5}$|^[0-9]{0,3}[hH]{1}[oO]{0,1}[0-9]{0,5}$/ {print}'

答案2

如果你不完全依赖 awk,那么grep这里可以很好地工作:

$ grep -E '\<[[:digit:]]{1,3}HO?[[:digit:]]{1,5}\>' filename
123H7292
234HO7027

这是您正在寻找的输出吗?我想知道是否HO90902应该匹配。

\<\>字边界,因此“12345678H123”将不匹配。

相关内容