如何使用 sed 命令 regexp group 将数据从组传递到部分 $()

如何使用 sed 命令 regexp group 将数据从组传递到部分 $()

我想使用 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它会抱怨日期无效。仅一次:在开始时,而不是在每一行。

因此,perlorbash是比 更好的选择sed

答案2

假设使用GNU sedas 我们正在调用sed 命令的/e修饰符s///。由于您没有共享任何输入数据,我假设它可能超过 15 个字符。

sed -E 's/^(.{15})(.*)/echo "$(date -d "\1" "+%s")\2"/e' /var/log/mail.log

相关内容