我是bash腳本的新手,我試圖只回顯符合特定格式的行。到目前為止,我有這樣的代碼:
LINE=1
while read -r CURRENT_LINE
do -r CURRENT_LINE
if [[ $CURRENT_LINE ==?-?-?? ]]
然后
echo "$LINE: $CURRENT_LINE"。
fi
((LINE ))
done < "./new-1.txt"
該文本檔案的每一行都包含符合以下格式的數字序列。"12-3-456",但也包含不同格式的序列,如 "123-89203-9420 "或 "123-456-7890"。我不太明白,為什么在符合格式的行上,while回圈內的if陳述句的結果不是真。我也嘗試過使用*,但使用它給我帶來了不正確的結果。
下面是文本檔案new-1.txt的內容。我想讓腳本輸出 "第1行:11-1-111",但它沒有輸出任何東西。
11-1-111
222-22-2222
333-33-3333
444-444-4444
555-555-5555
uj5u.com熱心網友回復:
也許可以嘗試使用bash的regex運算子(=~),例如:
while read -r CURRENT_LINE。
做
if [[ $CURRENT_LINE =~ [0-9][0-9]-[0-9]-[0-9][0-9] ]]
然后
echo "$LINE: $CURRENT_LINE"。
fi
((LINE ))
done < new-1.txt
或者,如果你愿意接受其他方法,使用nl(對行進行編號)和sed:
nl -n ln new-1.txt | sed -n '/[:digit:]]{2}-[[:digit:]]-[[:digit:]{3}/p'
或者用GNU grep:
grep -noP "[0-9][0-9]-[0-9][0-9]"/span> new-1.txt
uj5u.com熱心網友回復:
在regex術語中,?使得字符或選擇是可選的,即,一個字符/選擇最多允許出現一次,但也可以容忍零出現。
然而,==操作不是regex匹配操作。它是=~。
因此,將你的if子句改為下面的內容就可以了。
[[ $CURRENT_LINE =~ "^[0-9]{2}-[0-9]{1}-[0-9]{3}$"/span>]
這里
^指定了regex的開始,$指定了結束。所以我們有一個緊密耦合的模式來匹配[0-9]表示一個范圍,這里是從0到9的任何數字。{n}規定前面的字符/選擇應該正好匹配n的次數 。
注意:你也可以使用一個更粗略的[[:digit:]]而不是[0-9]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/307845.html
標籤:
