我試圖從制表符分隔的檔案中提取一個我需要存盤在變數中的數字。我正在使用正則運算式解決這個問題,這要歸功于我已經能夠構建的一些在線研究。
該檔案的組成如下:
0 0 2500 5000
1 5000 7500 10000
2 10000 12500 15000
3 15000 17500 20000
4 20000 22500 25000
5 25000 27500 30000
我需要在給定第一列的數字的情況下提取第二列中的數字。我在線撰寫并測驗了正則運算式:
(?<=5\t).*?(?=\t)
我需要第六行的 25000。
我開始使用sed,但正如您已經知道的那樣,即使可以-E選擇啟用正則運算式的擴展版本,它也不喜歡后視和前瞻模式。我也嘗試過awk和grep,但由于類似的原因失敗了。
更進一步,我發現perl可能是正確的命令,但我無法使其正常作業。我正在嘗試使用命令
perl -pe '/(?<=5\t).*?(?=\t)/' | INFO.out
但我承認我的知識很差,我有點迷失了。
下一步是從變數中讀取正則運算式中的“5”,因此如果您已經知道可能出現的問題,請告訴我。
uj5u.com熱心網友回復:
不需要后視 - 在空間上拆分每一行并檢查第一個欄位是否為5.
在 Perl 中有一個方便的命令列選項-a,用它為我們拆分每一行,我們得到@F帶有欄位的陣列
perl -lanE'say $F[1] if $F[0] == 5' data.txt
請注意,這對5數字 ( ==)
uj5u.com熱心網友回復:
為什么需要使用正則運算式?如果您所做的只是查找以 5 開頭的行并獲取您可以使用的第二列sedand cut,例如:
<infile sed -n '/^5\t/p' | cut -f2
輸出:
25000
uj5u.com熱心網友回復:
grep支持-Pperl regex 和-oonly-matching,因此這適用于后視:
grep -Po '(?<=5\t)\d ' file
或者perl -n,顯示 usings///e匹配和列印捕獲組:
perl -lne 's/^5\t(\d )/print $1/e' file
將grep -Po可以很容易地使用shell變數:
VAR=5 && grep -Po "(?<=$VAR\t)\d "
uj5u.com熱心網友回復:
一種選擇是使用 sed,在字串的開頭匹配 5,并在選項卡捕獲組中的數字之后
sed -En 's/^5\t([[:digit:]] )\t.*/\1/p' file > INFO.out
檔案 INFO.out 包含:
25000
uj5u.com熱心網友回復:
使用 sed
$ var1=$(sed -n 's/^5[^0-9]*\([^ ]*\).*/\1/p' input_file)
$ echo "$var1"
25000
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/363293.html
