有一个文件,其中一些行包含一些文本和日期或时间戳:
...
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
那么可以做些什么呢?
答案 0 :(得分:0)
有趣的是,这里发生了什么。一些指示:
$
等特殊字符,请始终单引号为sed。这就是为什么date
正在运行(-d @\\1
),然后才开始参与。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"