2011-01-14 7 views
2

"date = month_name DD、YYYY"および "date =(month_name DD、YYYY)の形式の日付を持つテキストファイルがあります。 "日付(month_name DD、YYYY)から(YYYY-MM-DD)に変換するスクリプト

これらの日付を「date = YYYY-MM-DD」の形式に変換するにはどうすればよいですか?

また、フィールド名「accessdate =」またはフィールド名を前に置いて、変換したい日付がいくつかあります。

ありがとうございました。

補遺:

  • 月の名前は、例えば、完全な英語の月名されています1月、2月など
  • refタグ内の日付を変換したい場合は、他のテキストの内側に囲まれます。<ref></ref>'
  • スクリプト作成の言語は自由です。私は少しbash、javascript &のpythonをやった。しかし、awk、sed、perlなどもうまくいくと思います。コードの説明は分かります。
+0

あなたはあなたが使用している栄養素を好みますか?これはPHP、シェルスクリプト、Pythonなどになりますか? – Spudley

+0

また、月の名前は長いか短いか? (またはその2つの混合物?)英語で書かれていますか? – Spudley

+0

これはシェルまたはPerlでですか? – tchrist

答えて

0

あなたは

echo 'date=April 13, 1985' | sed -e 's/January/01/' ... \ 
     -e 's/April/04/' ... -e 's/December/12/' | \ 
    sed 's/\([0-9]*\)[^0-9]\([0-9]*\)[^0-9] \([0-9]*\)$/\1-\2-\3/' 

処理するには、 "日付=(MONTH_NAME DD、YYYY)" あなたもパイプにsed 's/date=(\([^(]*\))/date=\1/'を追加するというようにすることができますで始めることができます。

あなたの補遺について。 sedは<ref></ref>タグで動作するのに十分ではありません。だから、もっと強力なものを使用しなければなりません。例えば。 Python。

re.search()<ref>と一致する</ref>を見つけるために使用できます。次にre.match()は、sedで使われているものと同様の正規表現を使って内部のものを変換するのに使うことができます。このアルゴリズムは、whileループ内に囲まれて、すべての文書をトラバースする必要があります。

+0

ヒントのおかげで。私はre.searchとre.matchで提案した方法を試してみます。 – ylivuoto

+0

上記のコードでは、月名を解析する際に-eの前に "| sed"を入れる必要があり、最後に\ 3- \ 1- \ 2/yyyyy- mm-dd形式です。 – ylivuoto

+0

実際には "sed"を置く必要はありませんでしたが、別の行にコードを分割するために '\'の後ろに空白があるためにエラーが発生しました。 – ylivuoto

0

使用するツールによって異なります。

など。あなたはこのような何かを行うことができますのsed awkの&で:

awk '{ 
     /date=(?Jan/ {print "s/\\(.\\+\\)date=(\\?month_name \\(\\d\\d\\), \\(\\d\\d\\d\\d\\))\\?\\(\.\\+\\)$/\\1date=\\3-01-\\2\\4"} 
     /date=(?Feb/ {print "s/\\(.\\+\\)date=(\\?month_name \\(\\d\\d\\), \\(\\d\\d\\d\\d\\))\\?\\(\.\\+\\)$/\\1date=\\3-02-\\2\\4"} 
     /date=(?Mar/ {print "s/\\(.\\+\\)date=(\\?month_name \\(\\d\\d\\), \\(\\d\\d\\d\\d\\))\\?\\(\.\\+\\)$/\\1date=\\3-03-\\2\\4"} 
     # ... 
}' INPUT_FILE > tmp.sed 

は、その後、あなたは

sed -i.ORIG -f tmp.sed INPUT_FILE 

を行うこともできますし、$ 0解析することによって、純粋なawkの中でそれを書くことができます。

関連する問題