연도 범위가 1965-1996인지 grep 또는 egrep을 확인하십시오.

연도 범위가 1965-1996인지 grep 또는 egrep을 확인하십시오.

특정 날짜에 작동하는 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예를 들어 줄 끝에 (with)가 일치하지 않도록 하려면 패턴의 각 숫자 시작 부분에 삽입할 수 있습니다.1974\<

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

이렇게 하면 숫자가 다른 긴 단어의 하위 문자열이 아닌 단어가 됩니다.

관련 정보