2013-01-21 33 views
1

Possible Duplicate:
How can I change the format of a date from the command line?shell腳本來替代日期格式的XML文檔

在我跑夜間cron作業下載和XML文件。 XML文件格式有這樣的日期:

<date>2011-09-30</date> 

我想設置改變每個日期第二cron作業使用此格式:

<date>September 30</date> 

,然後保存文件。

有沒有一個很好的方法來做到這一點與shell腳本?

+0

我敢肯定,這可以通過調用來完成,以sed的...但我個人而言,我'使用像http://nokogiri.org/這樣的XML工具來做這樣的事情。只是個人喜好,因爲用字符串替換黑客入侵XML會導致如果格式發生變化等問題。 – Kansha

+0

@Kansha,請參閱我的文章,這就是爲什麼我在shell中顯示純Xpath解決方案的原因。 –

回答

1

您可以使用此:

date '+%Y-%m-%dT%T.%N' 
+0

你能解釋我可以如何使用它嗎? –

1

使用Xpath和外殼工具的解決方案:

的XML示例:

$ cat sample.xml 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<doc> 
<date>2011-09-30</date> 
</doc> 

獲取日期xmllintXpath

$ dat=$(xmllint --xpath '/doc/date/text()' sample.xml) 
$ echo $dat 
2011-09-30 

現在,轉換日期的格式:

$ new_dat=$(date -d "$dat" "+%B %d") 

(如果你想在當前日期代替,只是用new_dat=$(date "+%B %d")

xmlstarlet編輯XML:

$ xmlstarlet edit -L -u "/doc/date" -v "$new_dat" sample.xml 

最後

$ cat sample.xml 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<doc> 
    <date>septembre 30</date> 
</doc> 
+0

所以我運行下面的shell文件: '#/ bin/sh的 DAT = $(xmllint --xpath '/ DOC /日期/文()' 路徑/要/ file.xml new_dat = $(date -d「$ dat」「+%B%d」)) xmlstarlet edit -L -u「/ doc/date」-v「$ new_dat」path/to/file.xml' and the server給我以下錯誤: 'line 5:xmlstarlet:command not found' (這是給朋友,不幸使用godaddy) –

+0

錯誤非常明顯:您需要安裝xmlstarlet。 –

0

Bash的語法來過濾(標準輸入輸出STD)與一個日期格式轉換成其他文件...

while read line; do 
    case "$line" in 
    '<date>'*) 
     echo '<date>' 
     date -j -f %F `echo "$line" | sed -e 's/<date>//' -e 's-</date>--'` '+%B %d' 
     echo '</date>' 
     ;; 
    *) 
     echo "$line" 
     ;; 
    esac 
done 
+0

我在本地工作,但godaddy的shell會報錯: 'date:invalid option - 'j'' –