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フィールド区切り文字を設定/し、次の3つの基準のいずれかに一致する行を選択します。

  • 最後のフィールド(年)はで2020、2番目のフィールド(月)はより大きいです2。これは01/03/2020からのすべての日付と一致します31/12/2020
  • 最後のフィールド(年)は2021
    • 2番目のフィールド(月)が3ORより小さいです。
    • 最初のフィールド(日)は小さく、22番目のフィールド(月)は正確です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

2つの範囲を組み合わせます。

$ 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

関連情報