Linuxは一年中ファイルの日付形式を変更します

Linuxは一年中ファイルの日付形式を変更します

年度全体のファイルの日付形式を変更しようとしています。これは私のデータです。

06/30/21 07/01/21 05436841182400056721972 random text
07/06/21 07/07/21 05436841188400057034635 random text
07/17/21 07/19/21 05410191199637000037473 random text
07/21/21 07/22/21 55483821203091001733933 random text
07/24/21 07/26/21 55457021206837001077531 random text

これが私が望むデータの外観です。

06/30/2021 07/01/2021 05436841182400056721972 random text
07/06/2021 07/07/2021 05436841188400057034635 random text
07/17/2021 07/19/2021 05410191199637000037473 random text
07/21/2021 07/22/2021 55483821203091001733933 random text
07/24/2021 07/26/2021 55457021206837001077531 random text

21がファイル内のさまざまな場所にあるため、必要に応じて一括交換できません。

sed 's/21/2021/' junk_dates1
06/30/2021 07/01/21 05436841182400056721972 random text
07/06/2021 07/07/21 05436841188400057034635 random text
07/17/2021 07/19/21 05410191199637000037473 random text
07/2021/21 07/22/21 55483821203091001733933 random text
07/24/2021 07/26/21 55457021206837001077531 random text

日付の後にデータがあるので、アンカートリックの使用方法がわかりません。

sed 's/21$/2021/' junk_dates1
06/30/21 07/01/21 05436841182400056721972 random text
07/06/21 07/07/21 05436841188400057034635 random text
07/17/21 07/19/21 05410191199637000037473 random text
07/21/21 07/22/21 55483821203091001733933 random text
07/24/21 07/26/21 55457021206837001077531 random text

ベストアンサー1

$ sed -E -e 's=^([0-9]{2})/([0-9]{2})/([0-9]{2}) ([0-9]{2})/([0-9]{2})/([0-9]{2}) =\1/\2/20\3 \4/\5/20\6 =' input.txt 
06/30/2021 07/01/2021 05436841182400056721972 random text
07/06/2021 07/07/2021 05436841188400057034635 random text
07/17/2021 07/19/2021 05410191199637000037473 random text
07/21/2021 07/22/2021 55483821203091001733933 random text
07/24/2021 07/26/2021 55457021206837001077531 random text

20これは、 incl プレフィックスを付ける必要があるすべての 2 桁の年に適用されます21。 6つのキャプチャグループを使用して、スペースで区切られた最初と2番目のフィールドの日、月、年数をキャプチャします。

21ただし、正規表現では、2つのsの後に空白文字があることに注意してください。それは必要な「アンカー」(または明確なポイント、識別マーク、または何かを呼びたいもの) - 見つけなければならないのは「21」だけでなく「21とスペース」です。ほとんど。これはまさに私がしたことではありませんが(行の先頭に複数のキャプチャグループが固定されている長い一致パターン^)、ここにない2桁の年を一致させる方法について考え始めました。行の終わり。

ただし、これは問題の1つを解決しますが、MM / DD / YYYYおよびDD / MM / YYYY日付形式に固有の曖昧さが持続します。代わりに、ISO 8601、YYYY-MM-DDに基づく日付を使用してください。たとえば、

$ sed -E -e 's=^([0-9]{2})/([0-9]{2})/([0-9]{2}) ([0-9]{2})/([0-9]{2})/([0-9]{2}) =20\3-\1-\2 20\6-\4-\5 =' input.txt 
2021-06-30 2021-07-01 05436841182400056721972 random text
2021-07-06 2021-07-07 05436841188400057034635 random text
2021-07-17 2021-07-19 05410191199637000037473 random text
2021-07-21 2021-07-22 55483821203091001733933 random text
2021-07-24 2021-07-26 55457021206837001077531 random text

\d\dところで、以下を使用するのではなく、perl正規表現を使用して読むのが簡単です[0-9]{2}

$ perl -pe 's=^(\d\d)/(\d\d)/(\d\d) (\d\d)/(\d\d)/(\d\d) =20$3-$1-$2 20$6-$4-$5 =' input.txt 
2021-06-30 2021-07-01 05436841182400056721972 random text
2021-07-06 2021-07-07 05436841188400057034635 random text
2021-07-17 2021-07-19 05410191199637000037473 random text
2021-07-21 2021-07-22 55483821203091001733933 random text
2021-07-24 2021-07-26 55457021206837001077531 random text

sed残念ながら、Perlを理解するバージョンはあまりありません\d。私が知っている唯一のバージョンは次のとおりです。スーパー sed-RPerl正規表現構文を使用するように指示するオプションがあります。

ssed -R 's=^(\d\d)/(\d\d)/(\d\d) (\d\d)/(\d\d)/(\d\d) =20\3-\1-\2 20\6-\4-\5 =' input.txt

Debian で実行している場合はssedパッケージに含まれます。他のディストリビューション用にパッケージすることもできます。どちらもperl -porを使用するよりも実際には何の利点もありませんperl -n

おすすめ記事