grep または egrep で検索すると、1965 年から 1996 年までの年が検索されます。

grep または egrep で検索すると、1965 年から 1996 年までの年が検索されます。

いくつかの日付には機能する 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]$'

これにより、数字は単語になり、他の長い単語の部分文字列にはなりません。

関連情報