如何找到文件上的时间戳,然后将其作为第一行回显到文件内容中?

如何找到文件上的时间戳,然后将其作为第一行回显到文件内容中?

我正在尝试调整以下命令:

stat -c %y test.txt | sed 's/^\([0-9\-]*\)/\1/'

这将返回以下信息:

2016-08-03 14:52:24.000000000

我需要调整一下,以便它排除.000000000输出的一部分。我尝试了几个不同的选项,但似乎都做不到。最终,我需要从上面的命令中提取时间戳,并将echo其作为第一行放入文件中。

我以此命令为例,它似乎正确地在文件顶部添加了一个新行:

sed -i '1s/^/this should be a date\n/' test.txt

如何将这两个命令结合起来?

答案1

就像这样:

( stat -c %y test_file.txt | awk -F '.' '{print $1}' ; cat test_file.txt  ) > /tmp/temp_file && mv /tmp/temp_file test_file.txt

这是一个小演示:

$> echo "Hello World" > test_file.txt
$> ( stat -c %y test_file.txt | awk -F '.' '{print $1}' ; cat test_file.txt  ) > /tmp/temp_file &&                       
> mv /tmp/temp_file test_file.txt
$> cat test_file.txt                                                                                                     
2016-08-03 09:24:27
Hello World

解释:

  • 我们在子shell中获取时间戳和文件内容,用括号表示(...)
  • stat -c %y test_file.txt | awk -F '.' '{print $1}'修剪时间戳
  • cat test_file.txt读取文件内容。
  • 生成的文本是时间戳加上文件中的内容,被重定向到/tmp/temp_file
  • 最后我们用以下内容替换原始文件/tmp/temp_file

答案2

sed -i "1i$(stat -c %y test.txt | sed -r 's/\.[0-9]+ / /')" test.txt

答案3

ed那么用代替怎么样sed

$ ed -s test.txt << EOF
0r !stat -c \%y %
1 s/\.[0-9]*//
w
q
EOF

这说:

  • 读取命令的输出stat -c \%y %并将其插入到缓冲区中的位置 0,即第一行之前。请注意,在 中ed联合国escaped%是当前文件的简写。
  • 在此行(现在是第一行)上,用小数点和后面的数字替换任何内容
  • 将结果写回文件并退出

-s是可选的 - 它只是阻止ed输出行数。如果stat在您的语言环境/时区中附加了时区偏移量,并且您还希望将其删除,那么您可以修改命令s以删除句点及其后的所有内容,例如s/\..*//

也可以ed在单行命令中使用echo或从标准输入中获取命令printf,尽管正确进行转义有点棘手:

printf '0r !stat -c \%%y %%\n1 s/\.[0-9]*//\nw\nq' | ed -s test.txt

答案4

我知道这是一篇老帖子,但也许使用 Linux 的“cut”命令可以使这个解决方案变得简单?

就像是:

stat -c %y 'composer.json' | cut -d '.' -f 1

这给了我一个漂亮、干净的输出:

2022-04-15 13:46:25

代替:

2022-04-15 13:46:25.692995716 -0600

我发现它对于许多类似的工作非常有用,并且有时当一项任务需要这么简单的东西时,cut它比摆弄awkgrep或要简单得多。sed

希望未来的读者认为这是一个能满足他们需求的好的解决方案。

相关内容