適切な正規表現を使用してawkでパターンを見つける方法は?

適切な正規表現を使用してawkでパターンを見つける方法は?

以下の例を使用してregexawk program

  • 出力は5より長くない数だけ可能です。IG15251
  • 出力には2文字のみを含めることができ、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`

しかし、ファイル名の数字を上書きしないでください。 つまり

>     189902 
>     12345556

次のスクリプトを試しても、出力はまだ正しくありません!

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

どんな説明の助けでも大変感謝します!

答え1

私はそれを2つの正規表現に分割し、これがうまくいくようです。

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

正規表現の最初の部分では5桁の数字のみを含むファイル名を試し、2番目の部分では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」は一致しません。

関連情報