Ищем диапазоны годов grep или egrep с 1965 по 1996 год

Ищем диапазоны годов grep или egrep с 1965 по 1996 год

У меня есть 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]$'

Это извлечет строки, которые заканчиваются любым из интересующих вас чисел. Обратите внимание, что выражения, как правило, следует заключать в кавычки.

Чтобы избежать сопоставления, например, 231974(которое соответствует 1974) в конце строки, вы можете вставить \<в начале каждого числа в шаблоне:

grep -e '\<196[5-9]$' \
     -e '\<197[0-9]$' \
     -e '\<198[0-9]$' \
     -e '\<199[0-6]$'

Это делает число словом, а не подстрокой какого-то другого более длинного слова.

Связанный контент