首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >macOS上的sed搜索/替换:将引用传递给替换字符串中的另一个命令

macOS上的sed搜索/替换:将引用传递给替换字符串中的另一个命令
EN

Stack Overflow用户
提问于 2020-11-19 18:14:47
回答 2查看 192关注 0票数 1

我在macOS上,有一个文件,里面有一堆日志和它们的时间戳。时间戳的格式为“秒自纪元”,但我想用"MM-DD-YY HH:MM:SS“的格式来替换它们。例如:

1605726368.416115秒后的时代应该替换为11-18-20 20:06:08。注意,由于Epoch时间戳是十进制值,这就是日志被时间戳的方式。

我试图通过seddate实现这一点,如下所示:

sed -E -i '' -e "s/^([0-9]+)([0-9.]+)/$(date -r \1 '+%m-%d-%Y %X')/" logfile.txt

问题是,date只将\1解释为1秒,而不是引用regex中的([0-9]+)捕获组。我尝试过很多东西,比如用$1\\1替换$1\\1,乱搞单引号和双引号,从自制中安装gnu-sed,并使用/e标志进行尝试,但都没有效果。因此,我的问题基本上是:是否可以在$(.)中使用\N回引用命令替换(特别是在sed替换字符串的上下文中)?

如果可能的话,我希望避免读取while循环中的每一行,并在每一行上调用sed,因为这非常慢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-19 19:28:08

您不能在sed中捕获值的反向引用上执行命令替换,因为命令替换将在此之前运行,它将采用文字\1而不是实际捕获的值。

如果您对perl解决方案很满意,那么这将很好地工作:

代码语言:javascript
复制
perl -pe 's/^[0-9]+\.[0-9]+/{
use POSIX qw( strftime ); strftime("%m-%d-%Y %X", localtime($&));
}/e' file.log

PS:如果您的时代值为gmtime,则可以使用GMT而不是localtime

票数 1
EN

Stack Overflow用户

发布于 2020-11-21 19:10:28

我将从paste的两个糟糕的解决方案开始,这可能会使您感到好笑。

当所有行都以时间戳开头时,可以使用

代码语言:javascript
复制
paste -d " " <(printf '%(%m-%d-%Y %X)T\n' $(cut -d"." -f1 logfile.txt)) \
             <(cut -d" " -f2- logfile.txt)

对于只有线条标记的行,这将失败,在今后的几年中,您可以使用。

代码语言:javascript
复制
paste -d " " <(printf '%(%m-%d-%Y %X)T\n' $(cut -d"." -f1 logfile.txt)) <(cut -c19- logfile.txt)

您可以像以前一样使用sed。首先提取命令,然后进行下一个源。

代码语言:javascript
复制
. <(sed -E 's/^([0-9]+)([0-9.]+)(.*)/printf "%(%m-%d-%Y %X)T" "\1"; echo "\3"/' logfile.txt)

我认为awk是最好的:

代码语言:javascript
复制
awk -F "." '{ print strftime("%m-%d-%Y %X",$1) substr($0,17) }' logfile.txt
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64917624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档