我有一個 grep 適用於某些日期,但無法讓我的大腦充分發揮其功能。
grep 19[6-9][5-6]$ filename
它正確地捕獲了一些,但我希望捕獲 1965 年至 1996 年之間的所有年份。
這是目前的解決方案,但實際上是在尋找一行,但這是我迄今為止得到的:
grep 196[5-9]$ filename
grep 197[0-9]$ filename
grep 198[0-9]$ filename
grep 199[0-6]$ filename
如果可能的話,尋找更好、更短的?
答案1
日期範圍和正規表示式並不是很好的匹配。如果我正確解釋 grep 中的 $,則日期是一行中的最後一個欄位。
嘗試這個:
awk '$NF >= 1965 && $NF <= 1996' filename
如果你必須使用 grep ,它會變得更加複雜:
grep -E '196[5-9]|19[78][0-9]|199[0-6]$' filename
答案2
您應該注意,egrep
允許19
將 分解出來,如下所示:
grep -E '19(6[5-9]|[78][0-9]|9[0-6])$' filename
這可能被認為更清楚。
答案3
您也可以使用seq
我發現更具可讀性的:
grep -E "$(seq -s "|" 1965 1996)" filename
-s, --separator=字串
答案4
使用標準grep
語法提取以 1965 到 1996 範圍內的任何子字串數字結尾的行(這也是相似的問題中使用者的嘗試):
grep -e '196[5-9]$' \
-e '197[0-9]$' \
-e '198[0-9]$' \
-e '199[0-6]$'
這會提取以您感興趣的任何數字結尾的行。
為了避免在行尾匹配eg 231974
(與)匹配,您可能需要在模式中每個數字的開頭插入:1974
\<
grep -e '\<196[5-9]$' \
-e '\<197[0-9]$' \
-e '\<198[0-9]$' \
-e '\<199[0-6]$'
這會強制數字成為一個單詞,而不是其他較長單字的子字串。