2011-01-14 45 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

你有什麼偏愛你使用的lanugage嗎?這會變成PHP,shell腳本,Python還是其他的東西? – Spudley 2011-01-14 14:30:02

+0

也是,月份名稱長或短? (或兩者的混合?),他們是英語嗎? – Spudley 2011-01-14 14:35:00

回答

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>標記一起使用。所以你必須使用更強大的東西。例如。蟒蛇。

re.search()可用於查找<ref>和匹配</ref>。然後使用re.match()可以使用類似於sed中使用的正則表達式來轉換內部的內容。該算法必須包含在循環中遍歷所有文檔的while循環中。

0

取決於您使用的工具。

E.g.與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 

或者你可以把它寫在純awk中,通過解析$ 0

相關問題