【问题标题】:How to change date string in txt file?如何更改txt文件中的日期字符串?
【发布时间】:2013-06-05 16:55:59
【问题描述】:

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

搜索和替换。

另外两个参数。 我想在日期之后删除小时。 并且只影响前面有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>

【问题讨论】:

标签: bash text replace


【解决方案1】:

您可以使用 perl“单线”来做到这一点:

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'

根据需要调整月份名称。

【讨论】:

  • 不要硬编码月份名称,而是让库为您处理:perl -MTime::Piece -i -pe 's/meta_value&gt;\K(\d{4}-\d\d-\d\d \d\d:\d\d:\d\d)/Time::Piece-&gt;strptime($1, "%Y-%m-%d %T")-&gt;strftime("%d %B %Y")/eg' 这也将尊重您的语言环境
【解决方案2】:

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

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”替换为包含许多内容但还包含此格式日期的文件吗? 丹萨亚格

您不能使用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#&lt;wp:meta_value&gt;} 语法的说明。

【讨论】:

  • 我可以将“2011-07-24 22:00:00”替换为包含许多内容但也包含此格式日期的文件吗?
  • 不确定你的意思。这允许您将任何日期从一种格式转换为另一种格式。
  • 对不起,我漏了一个字。我的意思是不想只转换一个日期。我有数千个文件。
  • 好的,你有一个包含 1000 个日期的文件。所有日期都只是一行上的日期,还是嵌入在文本中?有metadata&gt; 和没有metadata&gt; 的格式有区别吗?你能把文件的样本粘贴到Pastebin吗?这给了我一些工作。
  • 这看起来像这样 evcal_start_date2012-05-02 20:00:00
【解决方案3】:

使用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

这个想法是将一串月份数字添加到月份名称映射中并将其用作查找。

【讨论】:

  • 0 01January02February03March04April05May06June07July08August09September10October11November12DecemberEND
  • 顺便说一句,我还有其他字符串,例如 2011-07-24 22:00:00 但我不想更改它们,因为它们之前没有 meta_value> 字符串。
  • 如果您想要月份的全名,我的解决方案将不起作用。仅当您需要该月的前 3 个字符时,它才有效。
  • adminevcal_start_date0 01Jan02Feb03Mar04Apr05May06Jun07Jul08Aug09Sep10Oct11Nov12DecEND
  • 即使只有三个字母,它也会将所有日期替换为 0 01Jan02Feb03Mar04Apr05May06Jun07Jul08Aug09Sep10Oct11Nov12DecEND
【解决方案4】:

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

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

结果:

24 July 2011

【讨论】:

  • 1.它在 Mac OS X 中不起作用; 2.我想%B,而不是%b
【解决方案5】:

对于此类字符串处理,您应该始终考虑使用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 代码简洁易读。

【讨论】:

  • 替换和读取文件中字符串的命令是什么?
猜你喜欢
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多