我正在尝试调整以下命令:
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
它比摆弄awk
、grep
或要简单得多。sed
希望未来的读者认为这是一个能满足他们需求的好的解决方案。