0

sed を使用して、日付を「2012 年 6 月 14 日 5:00PM」から「2012-06-14」に変換する方法について質問があります。そのため、「5:00PM」も省略します。私は何かをしようとしてs/(...)(\d\d)(\d\d\d\d)/$2.$1.$3/いますが、それを正しくすることはできません。ありがとう!

4

3 に答える 3

2

あなたは本当にそれをするために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/

また、\dsedにはワイルドカードはありません。代わりに、次を使用する必要があります[[: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で拡張正規表現を使用することもできますが、何が楽しいでしょうか?)

とにかく、これもあなたの日付とは一致しません-構文エラーについて述べましたが、いくつかのセマンティックエラーもあります(たとえば、日付は正規表現に存在しないスペースで区切られています)。それにもかかわらず、日付がそれをより良くすることができるので、これは問題ではありません。

于 2012-06-18T12:30:21.860 に答える
1

これはあなたのために働くかもしれません:

echo "Jun 14 2012 5:00PM" |
sed 's/$/Jan01Feb02Mar03Apr04May05Jun06Jul07Aug08Sep09Oct10Nov11Dec12/;s/\(...\) \(..\) \(....\).*\1\(..\).*/\3-\2-\4/'
2012-14-06

逆参照を使用してルックアップと一致を追加します。

于 2012-06-18T20:51:45.840 に答える
0

あなたはこのようなことを試すことができます -

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
$
于 2012-06-19T05:30:48.410 に答える