2021년 1월 3일 - 2020년 1월 3일 범위의 줄만 출력하는 정규식을 작성하세요.

2021년 1월 3일 - 2020년 1월 3일 범위의 줄만 출력하는 정규식을 작성하세요.

2020년 1월 1일부터 2021년 4월 4일까지 날짜가 포함된 파일이 있습니다. egrep을 사용하여 2020년 1월 3일부터 2021년 1월 3일 사이의 날짜만 가져오고 싶습니다. 나는 ~하려고 노력한다

egrep "([0][1-9]|[1-2][0-9]|[3][0]/[0][3-9]|[1][0-2]/[2][0][2][0-1])$" dates.txt

하지만 여전히 파일의 모든 날짜가 표시됩니다.

$ cat dates.txt 
01/01/2020
24/01/2020
04/02/2020
23/02/2020
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021
25/03/2021
04/04/2021

답변1

날짜가 순서대로 있고 시작 날짜와 종료 날짜가 모두 파일에 있는 제공된 예제 파일을 사용하면 더 awk간단한 해결책을 찾을 수 있습니다.

$ awk '$1=="01/03/2020",$1=="01/03/2021"' dates.txt
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021
$

참고로 이용시 egrep참고 하세요더 이상 사용되지 않음, POSIX 호환 grep -E방법을 지원합니다.

답변2

나는 단지 정규식만을 사용하여 이 작업을 수행하려고 하지는 않을 것입니다. 더 정교한 도구를 사용하면 작업이 더 쉬워집니다. 예를 들어 다음을 사용합니다 awk.

$ awk -F/ '($3==2020 && $2 > 2) || ($3==2021 && ($2 < 3) || ($1< 2 && $2 == 3))' dates.txt 
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021

awk필드 구분 기호를 설정 /하고 다음 세 가지 기준 중 하나와 일치하는 행을 선택하면 됩니다.

  • 마지막 필드(연도)는 이고 2020, 두 번째 필드(월)는 보다 큽니다 2. 이는 01/03/2020에서 까지의 모든 날짜 와 일치합니다 31/12/2020.
  • 마지막 필드(연도)는 2021
    • 두 번째 필드(월)가 3OR 보다 작습니다.
    • 첫 번째 필드(일)는 보다 작고 2두 번째 필드(월)는 정확히 입니다 3.

답변3

설명에 따르면 2020년 이후의 날짜가 필요합니다 01/03/2020. 그것은 다음과 같습니다:

$ egrep "(../(0[3-9]|1[0-2])/2020$)" dates.txt

또한 2021년부터 현재까지의 모든 날짜도 사용할 수 있습니다 01/03/2021. 해당 부분은 다음과 같습니다.

$ egrep "((/0[1-2]/|01/03/)2021$)" dates.txt

두 범위를 결합합니다.

$ egrep "(../(0[3-9]|1[0-2])/2020$|(/0[1-2]/|01/03/)2021$)" dates.txt

조금 단순화하면 grep -E(현재 egrep과 동일)로 변경하고 출력을 나열합니다.

$ grep -E "(/(0[3-9]|1[0-2])/2020|(/0[1-2]/|01/03/)2021)$" dates.txt
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021

귀하의 소스 파일은 다음과 같습니다:

$ cat dates.txt 
01/01/2020
24/01/2020
04/02/2020
23/02/2020
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021
25/03/2021
04/04/2021

답변4

그냥 awk를 사용하세요:

$ awk -F'/' '{d=$3$2$1} (20200301 <= d) && (d <= 20210301)' dates.txt
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021

위의 내용은 입력이 정렬되었는지 여부와 입력에 범위로 구분된 날짜가 있는지 여부에 관계없이 작동합니다.

"분리된 날짜를 제외하려는 경우 " <=로 변경하세요 .<between

관련 정보