我有一个包含此类日期字符串的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>
答案 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)
答案 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)
对于这类字符串处理,您应始终考虑python
,ruby
或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代码干净且易读。