我的文件看起来像这样:
[2024-01-20 15:23:00] hello world
[2024-01-20 15:42:00] bye
[2024-01-20 15:43:00] foo bar
...
此文件中的日期采用 UTC+1 格式,我想转换为 UTC
我尝试sed
与捕获组一起使用:
cat file | sed -E "s/(([0-9]+-[0-9]+-[0-9]+)? ?([0-9]+:[0-9]+:[0-9]+))/$(date -d "\1 UTC+1" +%H:%M:%S -u)/g"
但我得到:
date: invalid date ‘\\1 UTC+1’
我尝试过以下替换\1
:
"\1"
'\1'
\\1
"\\1"
'\\1'
以上均无效。
为了进行测试,我使用了这一行:
echo '19:40:14 foo bar' | sed -E "s/([0-9:]+)/$(date -d "\1 UTC+1" -u +%R)/g"
期望的结果:19:40:14
->18:40:14
如果时区是 UTC+1
我愿意使用其他东西而不是sed
使用 GNU sed 作为其
e
修饰符这种
$(...)
方法永远不会起作用,因为这种扩展是由 shell 处理的,而“sed”不是 shell 的一部分,这意味着$
命令行中的所有替换都发生在“sed”运行之前——而且它们只是完成了整个命令一次。(它不会在“sed”和为每个正则表达式匹配重新扩展的 shell 之间来回切换,也不会“同时”发生所有事情;存在一定的操作顺序。)
为此,需要在同一程序中进行日期调整。'sed' 没有这样的功能;AWK 可能会,尽管其他一些语言可能会更方便。
用 Python、Ruby、PHP、Perl 编写一个脚本,从 STDIN 读取每一行并执行正则表达式替换 - 所有这些语言都有一种方法使用“回调函数”作为正则表达式替换(例如,在 Python 中,您可以逐字传递一个函数作为参数,在 Perl 中您使用
/e
正则表达式选项)。(或者使用循环和 Bash 的正则表达式匹配运算符执行所有操作,包括 Bash 中的正则表达式。)
while read
[[ a =~ b ]]