sed を使用して、日付を「2012 年 6 月 14 日 5:00PM」から「2012-06-14」に変換する方法について質問があります。そのため、「5:00PM」も省略します。私は何かをしようとしてs/(...)(\d\d)(\d\d\d\d)/$2.$1.$3/
いますが、それを正しくすることはできません。ありがとう!
3 に答える
あなたは本当にそれをするためにsedを必要としません-あなたは日付を必要とします:
$ date --date='Jun 14 2012 5:00PM' '+%Y-%m-%d'
2012-06-14
このコマンドでは、日付'Jun 14 2012 5:00PM'
を、4桁の年(%Y
)、ハイフン、2桁の月(%m
)、別のハイフン、2桁の日(%d
)で構成される形式に変換するように求めています。
さて、あなたのsedコマンドについてのいくつかのメモ:
Sedは、特定の、いくらか制限された正規表現構文を使用します。違いの1つは、効果的にグループ化するには、括弧グループの前に円記号を付ける必要があることです。バックスラッシュがない場合、括弧は文字通りの括弧文字と見なされます。これは他の言語の正規表現とは正反対ですが、それはどのように機能するかです。だから、代わりに
s/(...)(\d\d)(\d\d\d\d)/$2.$1.$3/
あなたが持っている必要があります
s/\(...\)\(\d\d\)\(\d\d\d\d\)/$2.$1.$3/
また、\d
sedにはワイルドカードはありません。代わりに、次を使用する必要があります[[:digit:]]
:
s/\(...\)\([[:digit:]][[:digit:]]\)\([[:digit:]][[:digit:]][[:digit:]][[:digit:]]\)/$2.$1.$3/
または、さらに良い:
s/\(...\)\([[:digit:]]\{2\}\)\([[:digit:]]\{4\}\)/$2.$1.$3/
最後になりましたが、一致したグループへの参照は、でマークされていません$
が、代わりに円記号でマークされています。
s/\(...\)\([[:digit:]]\{2\}\)\([[:digit:]]\{4\}\)/\2.\1.\3/
(ああ、ええと、わかりました、GNU sedで拡張正規表現を使用することもできますが、何が楽しいでしょうか?)
とにかく、これもあなたの日付とは一致しません-構文エラーについて述べましたが、いくつかのセマンティックエラーもあります(たとえば、日付は正規表現に存在しないスペースで区切られています)。それにもかかわらず、日付がそれをより良くすることができるので、これは問題ではありません。
これはあなたのために働くかもしれません:
echo "Jun 14 2012 5:00PM" |
sed 's/$/Jan01Feb02Mar03Apr04May05Jun06Jul07Aug08Sep09Oct10Nov11Dec12/;s/\(...\) \(..\) \(....\).*\1\(..\).*/\3-\2-\4/'
2012-14-06
逆参照を使用してルックアップと一致を追加します。
あなたはこのようなことを試すことができます -
echo "Jun 21 2011 5:00PM" |
awk '{"date \"+%Y/%m/%d\" -d \""$1" "$2" "$3" \"" | getline var; print var}'
テスト:
$ echo "Jun 21 2011 5:00PM" |
awk '{"gdate \"+%Y/%m/%d\" -d \""$1" "$2" "$3" \"" | getline var; print var}'
2011/06/21
$