使用sed和embedded命令解析时间戳

时间:2014-11-10 14:39:12

标签: shell sed date-parsing

有一个文件,其中一些行包含一些文本和日期或时间戳:

...
string1-20141001
string2-1414368000000
string3-1414454400000
...

我想快速将时间戳转换为日期,如下所示:

$ date -d @1414368000 +"%Y%m%d"
20141027

我希望使用sed或类似的命令行工具动态执行此操作。为了测试我没有成功使用它:

$ echo "something-1414454400000" | sed "s/-\(..........\)...$/-$(date -d @\\1 +'%Y%m%d')/"
date: invalid date '@\\1'
something-

echo似乎正在发挥作用:

$ echo "something-1414454400000" | sed "s/-\(..........\)...$/-$(echo \\1)/"
something-1414454400

那么可以做些什么呢?

4 个答案:

答案 0 :(得分:0)

有趣的是,这里发生了什么。一些指示:

  • 如果可能的话,如果使用BASH(等),特别是,如果使用$等特殊字符,请始终单引号为sed。这就是为什么date正在运行(-d @\\1,然后才开始参与
  • 你"工作" echo示例不是,实际上(我相信):echo \\1生成\1(如上所述,在调用sed之前会这样做)。这恰好发生在有效的sed替换语法中,因此将在LHS上替换您的组,这就是输出看起来关于正确的原因。
  • 请注意,通过使用-r,您可以使用更简单/更高级的正则表达式语法。

如果没有更多的上下文,很难确切地说要做什么,但要解决眼前的问题,请尝试以下方法:

echo "something-1414454400000" | sed -re 's/-([0-9]{10,}).+/-$(date -d @\1 +"%Y%m%d")/'

生成:$(date -d @1414454400)(然后可以将其导入sh

或者对于更完整的解决方案,您可以更改正则表达式以直接生成shell命令并管道它:

echo "something-1414454400000" | sed -re 's/(.*-)([0-9]{10,10}).+/echo \1$(date -d @\2 \"+%Y%M%d\")/' | sh

..生成something-20140028

答案 1 :(得分:0)

您可以在BASH

中执行此操作
while read -r p; do
   if [[ "$p" =~ ^(.+-)([0-9]{10}).{3}$ ]]; then
      echo -n "${BASH_REMATCH[1]}"
      date -d "@${BASH_REMATCH[2]}" +"%Y%m%d"
   else
      echo "$p"
   fi
done < file

<强>输出:

string1-20141001
string2-20141026
string3-20141027

答案 2 :(得分:0)

awk -F- 'BEGIN { OFS=FS }
    $2 ~ /^[0-9]{13}$/ {
        "date -d@" $2/1000 " +%Y%m%d " | getline t; $2=t }1'

答案 3 :(得分:0)

试试这个命令。我检查了一下。它正在努力你的输入。

cat file | sed -E "s,(.*)-(.*),\1-`date -d @1414368000 +'%Y%m%d'`,g"