次の内容を含むファイルがあります。
$ cat file.txt
on that date April 02, 2020 end of line
March 5, 2021 helloooo world
J 14, 2022
error 3, bye
日付形式を「月の年」から「日の月の年」に変更したいと思います。月は常に大文字で始まり、日付は1桁または2桁、年は4桁です。
希望の出力:
on that date 02 April 2020 end of line
5 March 2021 helloooo world
14 J 2022
error 3, bye
以下を試しましたが、日付と年を取得できますが、月は取得できません
sed -r 's/([0-9]*[0-9]), ([0-9]{4})//g'
Linuxシステムでsedを使用してこれをどのように実行できますか?
答え1
データが示されているものと同じであり、Foo 12, 0000
日付として扱ってはいけないものがないと仮定すると、これを行う方法は次のとおりです。
$ sed -E 's/([A-Z][a-z]+) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' file
on that date 02 April 2020 end of line
5 March 2021 helloooo world
J 14, 2022
error 3, bye
大文字の後に 1 つ以上の小文字 ( [A-Z][a-z]+
)、スペースと 1 つまたは 2 つの数字 ( [0-9]{1,2}
)、カンマとスペース、正確に 4 つの数字、単語の境界 ( \b
: 単語から非単語への変換; 空白、行末、または単語文字以外のすべて)一致します。捕獲そのグループを置き、\1
それを交換に使用します。\2
\3
J 14, 2022
これは有効な日付ではないため機能しません。たとえば、M 14 2020
3月14日ですか、それとも5月14日ですか?本当にこのようなものを一致させたい場合は、次のことを試すことができます。
$ sed -E 's/([A-Z][a-z]*) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' file
on that date 02 April 2020 end of line
5 March 2021 helloooo world
14 J 2022
error 3, bye
最後に、その月の最初の文字で見つけることができる大文字だけを見つけて、より具体的にすることもできます。
sed -E 's/([JFMASOND][a-z]*) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' file