我想使用 sed 命令将 mail.log 中的日期更改为时间戳格式。如何将 \1 从组传递到 $() 内的 date 命令存在问题?
sed -E "s/(^.{15})/$(date -d "\1" "+%s")/" /var/log/mail.log
答案1
这是引用和扩展的一课:-)
"s/(^.{15})/$(date -d "\1" "+%s")/"
因此,该论证是以下内容的串联:
's/(^.{15})/$(date -d '
,按原样传递\1
,由 shell 解释- “”(单个空格)按原样传递
+%s
由 shell 解释)/
这是按原样传递的。
你想要的是:
s/(^.{15})/$(date -d "\1" "+%s")/
日期部分由 shell 扩展。
有两种方法可以实现这一目标。创意引用:
"s/(^.{15})/$(date -d '\1' '+%s')/"
或栅栏:
"s/(^.{15})/$(date -d \"\1\" \"+%s\")/"
但这仍然行不通,因为它是date
在命令行展开时运行的,而不是针对文件中的每一行运行的。所以date
只看到\1
它会抱怨日期无效。仅一次:在开始时,而不是在每一行。
因此,perl
orbash
是比 更好的选择sed
。
答案2
假设使用GNU sed
as 我们正在调用sed 命令的/e
修饰符s///
。由于您没有共享任何输入数据,我假设它可能超过 15 个字符。
sed -E 's/^(.{15})(.*)/echo "$(date -d "\1" "+%s")\2"/e' /var/log/mail.log