【发布时间】:2016-03-08 08:50:08
【问题描述】:
假设我想通过date 命令将时间戳中的日期转换为另一种格式。在控制台中我会说date -d@<timestamp>,但我碰巧想对文本文件中的许多字段执行此操作。
使用e 在sed 中执行(实际上是sed (GNU sed) 4.2.2)我是说:
$ echo 1449158360 | sed -r 's#.*([0-9]{10}).*#date -d@\1 "+%Y";#e'
2015
很好用!
现在我创建了一个虚拟文件myfile:
my timestamp is 1449158360 but also I wonder what date was 1359199960.
我想替换为相同但具有时间戳的相对年份:
my timestamp is 2015 but also I wonder what date was 2013.
但是,如果我尝试运行与上面相同的命令,它会失败:
$ sed -r 's#([0-9]{10})#date -d@"\1" "+%Y";#e' myfile
sh: my: command not found
sh: but: command not found
因为sed 将第一个单词解释为要执行的内容。
如果我只获取这些数据而不是其他任何东西,显然它会起作用:
$ sed -r 's#.*([0-9]{10}).*#date -d@"\1" "+%Y";#ge' myfile
2015
所以我想知道:我应该怎么做才能针对sed 中的捕获组调用date 并用它替换文本,考虑到它被其他必须保持不变的文本包围?
【问题讨论】:
-
不是真的,@TobySpeight 因为我在这里问为什么它没有按照我尝试的方式工作。
-
您阅读那里的答案了吗?具体来说,my comments on sed
s///e- 我推荐 Perl 而不是 sed 来完成这项工作。 -
@TobySpeight 我读过它们,那里甚至有一个已删除的答案:) 我明白这里的重点是关于您在回答中提到的内容,请注意 /e 会导致命令替换替换整个模式空间,因此您可能需要使用保持空间来保留替换前后的文本。这是留给读者的练习 这是我无法执行的最后一部分。稍后我将进行编辑以专注于这个特定问题。