如何在txt文件中更改日期字符串?

时间:2013-06-05 16:55:59

标签: bash text replace

我有一个包含此类日期字符串的txt文件:2011-05-21 19:30:00 我想搜索所有txt文件并将此“年 - 月 - 日”字符串替换为“day MonthInLetter year”

搜索并替换。

另外两个参数。 我想在日期之后删除小时。 并且只影响在它之前有meta_value>字符串的小时。

meta_value>2011-07-24 22:00:00

成为

meta_value>24 July 2011

你能帮助我吗?

谢谢!

编辑:

文件解析如下:

 <item>
      <title><![CDATA[UN VIOLON SUR LE TOIT AH, SI J’ETAIS RICHE! ]]></title>
      <pubDate/>
      <dc:creator>admin</dc:creator>
      <description/>
      <content:encoded/>
      <wp:postmeta>
        <wp:meta_key>evcal_start_date</wp:meta_key>
        <wp:meta_value>2010-02-04 11:00:00</wp:meta_value>
      </wp:postmeta>
      <wp:postmeta>
        <wp:meta_key>evcal_end_date</wp:meta_key>
        <wp:meta_value>2010-07-31 20:00:00</wp:meta_value>
      </wp:postmeta>
      <wp:postmeta>
        <wp:meta_key>evcal_location</wp:meta_key>
        <wp:meta_value>8 rue du Fbg Montmartre, 75009 Paris</wp:meta_value>
      </wp:postmeta>
      <wp:postmeta>
        <wp:meta_key>evcal_organizer</wp:meta_key>
        <wp:meta_value>Le Palace</wp:meta_value>
      </wp:postmeta>
      <wp:postmeta>
        <wp:meta_key>evcal_allday</wp:meta_key>
        <wp:meta_value>no</wp:meta_value>
      </wp:postmeta>
      <wp:post_date/>
      <wp:post_date_gmt/>
      <wp:comment_status/>
      <wp:ping_status>open</wp:ping_status>
      <wp:post_name>un-violon-sur-le-toit-ah-si-jretais-riche-</wp:post_name>
      <wp:status/>
      <wp:post_parent>0</wp:post_parent>
      <wp:menu_order>0</wp:menu_order>
      <wp:post_type>ajde_events</wp:post_type>
      <wp:post_password/>
      <wp:is_sticky>0</wp:is_sticky>
      <category domain="category" nicename=""/>
    </item>

5 个答案:

答案 0 :(得分:1)

您可以使用perl“one-liner”来执行此操作:

perl -wi -pe 'BEGIN{@month=('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')};
s/meta_value>(\d\d\d\d)-(\d\d)-(\d\d) \d\d:\d\d:\d\d/"meta_value>$3 $month[0+$2] $1"/eg'

根据需要调整月份名称。

答案 1 :(得分:1)

  

使用日期,您可以从第一个日期格式转换为第二个日期格式:

     

date --date='2011-07-24 22:00:00' '+%d %B %Y'

     

它在Mac OS X中不起作用

在Mac OS X中,您需要使用date命令的 BSD表单

$ date -j -f"%Y-%m-%d %H:%M:%S" "2011-07-24 22:00:00" +"%d %B %Y" 
24 July 2011
  • -j说_不要设置日期“
  • -f有两个参数:日期格式和日期。 "%Y-%m-%d %H:%M:%S"是格式,"2011-07-24 22:00:00"是日期。
  • “+”是您希望输出的格式。

您可以在“终端”窗口中执行man strftime以查看各种日期格式字符。


附录

  

我可以用包含很多东西的文件替换“2011-07-24 22:00:00”,还可以用这种格式替换日期吗?   dansayag

您无法使用sed,但您可以逐行阅读该文件,如果这些行包含日期,则会将其删除。未测试的:

while read line
    do
    if ! grep -q "<wp:meta_value>"
    then
        echo "$line" >> $new_file_name
    else
        date=${line#<wp:meta_value>}  #Removes prefix
        date=${date%</wp:meta_value>} #Removes suffix
        date=$(date -j -f"%Y-%m-%d %H:%M:%S" "$date" +"%d %B %Y")
        echo "<wp:meta_value>$date</wp:meta_value>" >> $new_file_name
    fi
done < FileName

请参阅man bash并查看有关${parameter#word}${parameter%word}的部分,了解${line#<wp:meta_value>}语法的说明。

答案 2 :(得分:0)

使用date,您可以从第一种日期格式转换为第二种格式:

date --date='2011-07-24 22:00:00' '+%d %B %Y'

结果:

24 July 2011

答案 3 :(得分:0)

使用sed

$ cat file
meta_value>2011-07-24 22:00:00
meta_value>2011-12-25 22:00:00

$ sed -re 's/[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/\0 01Jan02Feb03Mar04Apr05May06Jun07Jul08Aug09Sep10Oct11Nov12DecEND/g' -e 's/([0-9]{4})-([0-9]{2})-([0-9]{2}) [0-9]{2}:[0-9]{2}:[0-9]{2} .*\2(...).*END/\3 \4 \1/g' file

meta_value>24 Jul 2011
meta_value>25 Dec 2011

我们的想法是在月份名称映射中添加月份编号字符串,并将其用作查找。

答案 4 :(得分:0)

对于这类字符串处理,您应始终考虑pythonrubyperl

#!/usr/bin/env python
import time

s = 'meta_value>2011-07-24 22:00:00'
d = s[s.index('>') + 1:]
ds = time.strftime('%d %B %Y', time.strptime(d, '%Y-%m-%d %H:%M:%S'))
print "%s%s" % (s[:s.index('>') + 1], ds)

此外,python代码干净且易读。