いくつかの日付には機能する grep がありますが、それを完全に機能させるのに苦労しています。
grep 19[6-9][5-6]$ filename
いくつかの年は正しく取得されますが、1965 年から 1996 年までのすべての年を取得したいと考えています。
これが現在の解決策ですが、実際には 1 行を探していますが、これまでに得たものは次のとおりです。
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]$'
これにより、数字は単語になり、他の長い単語の部分文字列にはなりません。