Linux

如何使用適當的正則表達式在 awk 中查找模式?

  • December 5, 2016

使用以下範例,我試圖找出regex在我的awk program.

  • 輸出只能是長度不超過 5 的數字:ig 15251
  • 輸出只能有兩個字母,5 之前和之後的"H" & "O"任何數字和“O”可以是可選的:ig HO722 或 799H89090=< 3``=<
  • 輸出不能包含任何有空格或除數字以外的任何單詞:ig hkks 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

任何解釋幫助都非常感謝!

我把它分成兩個正則表達式,看起來它正在工作:

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}'

如果您不完全依賴於 awk,那麼grep在這裡效果很好:

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

那是你要找的輸出嗎?我想知道是否HO90902應該匹配。

\<and\>是字邊界,因此“12345678H123”將不匹配。

引用自:https://unix.stackexchange.com/questions/328165