일부 날짜에는 작동하는 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=STRING
답변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]$'
이렇게 하면 숫자가 다른 긴 단어의 하위 문자열이 아닌 단어가 됩니다.