Bash 如何更改txt文件中的日期字符串?
我有一个带有此类日期字符串的txt文件:Bash 如何更改txt文件中的日期字符串?,bash,text,replace,Bash,Text,Replace,我有一个带有此类日期字符串的txt文件:2011-05-21 19:30:00 我想搜索所有txt文件并将此“年-月-日”字符串替换为“日-月-年” 搜索和替换 还有两个参数。 我想删除日期后的小时。 并且只影响前面有meta\u值>字符串的小时 meta_value>2011-07-24 22:00:00 变成 meta_value>24 July 2011 你能帮我吗 谢谢 编辑: 文件的解析方式如下: <item> <title><
2011-05-21 19:30:00
我想搜索所有txt文件并将此“年-月-日”字符串替换为“日-月-年”
搜索和替换
还有两个参数。
我想删除日期后的小时。
并且只影响前面有meta\u值>
字符串的小时
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>
管理
evcal\u开始日期
2010-02-04 11:00:00
evcal_结束日期
2010-07-31 20:00:00
evcal_位置
巴黎蒙马特路8号,75009
evcal_组织者
乐府
一整天
不
打开
我是一个富有的人-
0
0
ajde_事件
0
您可以使用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'
根据需要调整月份名称。使用,可以将第一个日期格式转换为第二个日期格式:
date --date='2011-07-24 22:00:00' '+%d %B %Y'
结果:
24 July 2011
使用
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
是将一个月数的字符串添加到月份名称映射中,并将其用作查找。
您应始终考虑<代码> Python < /C> > <代码> Ruby < /C> >或<代码> Perl 用于此类字符串处理。#!/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代码干净易读
使用日期,可以将第一种日期格式转换为第二种格式:
date --date='2011-07-24 22:00:00' '+%d %B %Y'
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
读取行时
做
如果!grep-q“”
然后
回显“$line”>>$new\u文件名
其他的
日期=${line#}删除前缀
日期=${date%}#删除后缀
日期=$(日期-j-f“%Y-%m-%d%H:%m:%S”“$date”+%d%B%Y)
回显“$date”>>$new\u文件名
fi
完成<文件名
有关
${line}的解释,请参见manbash
并查看关于${parameter\word}
和${parameter%word}
的部分
语法。1.它在Mac OS X中不起作用;2.我假设%B
,而不是%B
?0 01一月02日二月03日三月04日四月05日五月06日六月07日七月08日八月09日九月10日十月11日十一月12日顺便说一句,我还有其他字符串,如2011-07-24 22:00:00,但我不想更改它们,因为它们之前没有meta_值>字符串它们。如果您需要月份的全名,我的解决方案将不起作用。它仅在您需要月份的前3个字符时才起作用。admin evcal_start_date 0 01Jan02Feb03Mar04Apr05May06Jun07Jul08Aug09Sep10Oct11Nov12DecEND evcal_end_date 0 01Jan02FEB03MAR04APR05MAY06JUN07JUN08AUG009SEP10OCT11NOV12DECEDEVEN仅使用三个字母替换所有日期为0 01JAN02FEB03MAR04APR05MAY06JUN07JUN08AUG009SEP10OCT11NOV12DECEDE替换和读取文件中字符串的命令是什么?我可以替换“2011-07-24 22:00:00”吗“一个文件包含很多东西,但也包含这种格式的日期?不知道你的意思。这允许您将任何日期从一种格式转换为另一种格式。对不起,我漏掉了一个单词。我的意思是不想只转换一个日期。我的文件里有几千个。好吧,你的文件里有1000个日期。所有的日期都只是一行中的日期,还是嵌入到文本中?有元数据>
时的格式与没有元数据时的格式有区别吗?你能把这个文件的样本粘贴进去吗?这给了我一些可以处理的东西。这看起来像是evcal\u开始日期2012-05-02 20:00:00,而不是硬编码月份名称,让一个库为您处理:perl-MTime::Piece-i-pe的/meta\u值>\K(\d{4}-\d\d-\d\d\d:\d\d)/Time::Piece->strtime($1,%Y-%m-%d%T”)>strftime(%d%B%Y)/例如,
这也将尊重您的区域设置