我嘗試使用 AWK 捕獲檔案中的數字,我可以捕獲所有數字,但我無法捕獲一定數量的數字。我做錯了什么?
echo -e "$teste" | awk '/_OA/ { match($0,/\[\([:digit:]{4,13}\]/);oa = substr($0,RSTART,RLENGTH);print oa}'
檔案樣本:
_OA ............. [6712227000168]
_OA Tasdsd, OA .. [91][355016]
_OA Tasdsd, DA .. [91][5512987000]
預期的:
6712227000168
355016
5512987000
正則運算式匹配答案的提示:非常感謝所有答案,由于我的 awk 版本,我發現我需要使用--posix選項的鏈接。
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk解決方案。如果行從列印第二個最后一個欄位開始,只需將欄位分隔符設定為]OR并在主塊檢查條件下進行。[_QA
awk -F"[][]" '/^_QA /{print $(NF-1)}' Input_file
uj5u.com熱心網友回復:
您可以更新 RSTART 和 RLENGTH 的模式和值,使其與前導方括號和尾隨方括號不匹配。
數字部分應該是[[:digit:]],并且模式中有一個不應該存在\(的匹配。(
awk '/_OA/ { match($0,/\[[[:digit:]]{4,13}\]/);oa = substr($0,RSTART 1,RLENGTH-2);print oa}' <<< "$teste"
輸出
6712227000168
355016
5512987000
由于方括號之間出現多次數字,如果要匹配多次出現:
teste='_OA Tasdsd, OA .. [91][355016][123456789][1][9999]'
awk '/_OA/ {
while(match($0,/\[[[:digit:]]{4,13}]/)){
start=RSTART 1; len=RLENGTH-2
s=substr($0,start,len)
res=res?res","s:s
$0=substr($0,start len)
}
print res
res = ""
}' <<< "$teste"
輸出
355016,123456789,9999
uj5u.com熱心網友回復:
你的正則運算式\[\([:digit:]{4,13}\]說:
\[= 文字字符[\(= 文字字符([:digit:]= 包含字符:,d,i,g,字符集的括號運算式t{4,13}= 一個正則運算式區間,它是前面括號運算式的 4 到 13 次重復\]= 文字字符]
導致您的正則運算式無法匹配您的任何輸入的兩個主要問題是:
- 您的輸入中沒有任何
(s (來自上面的#2),并且 - 要匹配數字,您需要
[:digit:]括號運算式內的字符類,而不是括號運算式內[[:digit:]]的字符集(來自上面的#3):digit:[:digit:]
您實際上也不需要]在正則運算式的末尾轉義,因為如果前面有匹配的未轉義[(括號運算式的開頭),它只是一個正則運算式元字符(括號運算式的結尾)。
所以我認為你想寫的正則運算式應該是:
\[[[:digit:]]{4,13}]
例如:
$ awk '/_OA/ { match($0,/\[[[:digit:]]{4,13}]/);oa = substr($0,RSTART,RLENGTH);print oa}' file
[6712227000168]
[355016]
[5512987000]
或僅列印數字:
$ awk '/_OA/ { match($0,/\[[[:digit:]]{4,13}]/);oa = substr($0,RSTART 1,RLENGTH-2);print oa}' file
6712227000168
355016
5512987000
uj5u.com熱心網友回復:
如果你沒有和 awk 結婚:
grep -Eo '[[:digit:]]{4,13}'
使用 GNU awk:
gawk 'match($0, /[[:digit:]]{4,13}/, m) {print m[0]}'
但這只匹配每條記錄中的第一個這樣的數字。要全部找到它們:
gawk '{
line = $0
while (match(line, /[[:digit:]]{4,13}/, m)) {
print m[0]
line = substr(line, m[0,"start"] m[0,"length"])
}
}'
參考 gawk 手冊中的match功能。
uj5u.com熱心網友回復:
您可以使用
awk '/_OA/ { match($0,/\[[[:digit:]]{4,13}]/);print substr($0,RSTART 1,RLENGTH-2)}'
查看在線演示:
#!/bin/bash
s='_OA ............. [6712227000168]
_OA Tasdsd, OA .. [91][355016]
_OA Tasdsd, DA .. [91][5512987000]'
awk '/_OA/ { match($0,/\[[[:digit:]]{4,13}]/);print substr($0,RSTART 1,RLENGTH-2)}' <<< "$s"
輸出:
6712227000168
355016
5512987000
詳情:
\[- 一個[字符[[:digit:]]{4,13}- 四到十三位數字(注意[:digit:]POSIX 字符類必須在 中使用[...],括號運算式)]- 一個]字符(它并不特殊,不需要轉義)
并且substr($0,RSTART 1,RLENGTH-2)意味著我們
$0- 參加比賽RSTART 1- 從第二個字符開始RLENGTH-2- 然后與匹配長度一樣多的字符 - 2(從而擺脫封閉[和]字符)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/527933.html
標籤:正则表达式重击awk
下一篇:使用bash決議和修改csv
