Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何更改txt文件中的日期字符串?_Bash_Text_Replace - Fatal编程技术网

Bash 如何更改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><

我有一个带有此类日期字符串的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><![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)/例如,
这也将尊重您的区域设置