【问题标题】:Sed substitution and external commandsed 替换和外部命令
【发布时间】:2013-09-28 06:27:22
【问题描述】:

我有一个这种格式的输入日志文件

May 23 2012 11:59:56
a;b;c
May 21 2012 16:54:12
d;e;f
May 19 2012 16:22:52
g;h;i
...

我想以这种格式输出它

2012-05-23
a;b;c
2012-05-21
d;e;f
2012-05-19
g;h;i
...

使用sed,我知道如何替换日期线

% sed 's/.*:.*:.*/match_string/' input.txt
match_string
a;b;c
match_string
d;e;f
match_string
g;h;i
...

使用date,我知道如何转换日期:

% date -d 'May 23 2012 11:59:56' '+%Y-%m-%d'
2012-05-23

但是如何在 sed 命令期间评估 match_string 呢?

【问题讨论】:

  • 您可能想在您的date 命令中使用May 23 ... 而不是May May 23 ...
  • 我更正了打字错误,抱歉。
  • 是否需要外部命令?见sed.sf.net/grabbag/tutorials/lookup_tables.txt
  • 日期转换不是一件容易的事,我不想重新发明轮子。

标签: bash sed


【解决方案1】:

如果您有 GNU Sed 可用,您可以使用 e 标志:

sed 's/.*:.*/date -d"&" "+%Y-%m-%d"/ge' file

将为您的示例提供帮助,请参阅测试:

kent$  echo "May 23 2012 11:59:56
a;b;c
May 21 2012 16:54:12
d;e;f
May 19 2012 16:22:52
g;h;i"|sed 's/.*:.*/date -d"&" "+%Y-%m-%d"/ge'
2012-05-23
a;b;c
2012-05-21
d;e;f
2012-05-19
g;h;i

【讨论】:

    【解决方案2】:

    我会为此使用 Perl:

    perl -pe '$_ = qx{ date -d "$_" +%F } if $. % 2 == 1'
    

    当然 Perl 可以做 date 所做的事情:

    perl -MTime::Piece -lpe '
        $_ = Time::Piece->strptime($_, "%b %d %Y %T")->ymd if $. % 2 == 1
    '
    

    【讨论】:

    • 问题是关于 sed。我知道我们可以在 awk、python 中做类似的事情......这取决于你已经知道的内容。
    • 不要忘记答案不只是给你的。
    • 我知道这一点,但在此之前我搜索过类似的问题。所有的答案都是关于 awk、perl 等的不同可能性。这就像在 C++ 中提出问题并在 Java 中得到答案。非常混乱。
    猜你喜欢
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 2020-10-09
    • 2022-01-10
    • 2019-02-11
    • 2018-09-16
    • 2016-01-19
    • 1970-01-01
    相关资源
    最近更新 更多