【问题标题】:changing the date formatin linux bash更改 linux bash 中的日期格式
【发布时间】:2013-11-13 00:37:55
【问题描述】:

关于较早的答案,我需要将日期格式从 yyyy-mm-dd 更改为 yyyy/mm/dd。

我得到了这个答案:

sed -i 's@,\(....\)-\(..\)-\(..\) @,\1/\2/\3 @' /home/Documents/blah.csv

这非常有效,每行只有一个实例。然而,一行可以有许多这样的日期,我如何更改 sed 命令,以便它为检测到的每个实例(不仅仅是第一个)执行它。

示例文档:

2012-09-09,123143,2012-09-09,12837,2012-09-07,2131,2012-08-06,1237
#and many more lines like that.

运行 sed 命令后,我得到了这个:

2012-09-09,123143,2012/09/09,12837,2012-09-07,2131,2012-08-06,1237

它只适用于第二个日期实例,我如何使它适用于所有这些实例?

【问题讨论】:

  • 也许可以将- 替换为/。这将与tr -- - /
  • 您可以将字母 g 作为修饰符附加到 sed 命令,使其在每一行中看起来像 g。但是,请确保所有匹配项保持正确。示例:sed -i 's@match@replacement@g' document
  • 是的.. g 工作.. 但它总是跳过第一个.. 所以基本上我现在得到这个:2012-09-09,123143,2012/09/09,12837,2012/ 09/07,2131,2012/08/06,1237
  • 它有效,我错过了他额外的逗号。基本上它必须是这个 sed -i 's@(..)-(..)-(..) @\ 1/\2/\3 @g' /home/Documents/blah.csv

标签: linux bash csv sed


【解决方案1】:

使用g 标志,对一行中的每个匹配项进行替换,而不仅仅是第一个匹配项。此外,第一个日期不匹配,因为它前面没有逗号。

sed -i 's@\(....\)-\(..\)-\(..\)@\1/\2/\3/@g' /home/Documents/blah.csv

这解决了一些问题:

  1. 不要费心匹配逗号;数据的 4-2-2 性质应该足够了,第一个字段不匹配,因为它前面没有逗号。

  2. 在终止 @ 之后添加 g 标志以替换所有匹配项,而不仅仅是第一个匹配项。

  3. 在年份 (\1) 和月份 (\2) 之间添加了一个被遗忘的 /

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2016-11-22
    相关资源
    最近更新 更多