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

答え2

私はこれを提案する

$ sed 's;\(../../\)21;\12021;g' foo.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 ransom text

  • \(../../\)21スラッシュ括弧は、の置換で参照される\(...\)パターンをキャプチャします。パターンがあれば交換されます。char char slash char char slash\1212021

オプション-E--regexp-extended)を使用するとより明確になります$ sed 's;(../../)21;\12021;g'

答え3

挿入する文字位置(15と6)が20常に同じであるとします。

sed 's/.\{15\}/&20/;s/.\{6\}/&20/' file
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

答え4

$ sed 's:/\(.. \):/20\1:g' file
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

作業が簡単なため、日付形式をYYYY / MM / DDまたは同様の形式に変更することを検討する必要があります。たとえば、その形式の日付を文字列でソートして比較できます。

$ sed 's:\(.....\)/\(..\) :20\2/\1 :g' file
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

またはISO 8601標準:

$ sed 's:\(..\)/\(..\)/\(..\):20\3-\1-\2:g' file
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

関連情報