У меня есть 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]$'
Это делает число словом, а не подстрокой какого-то другого более длинного слова.