linux - 从 git log 输出中替换文件中的第二个字段

标签 linux bash git awk sed

我有一个包含完整文件路由和时间戳的文件。

xxxx/view/css/animate.css/3.1.1/animate.min.css: 1494509091
xxxx/view/fonts/cinzel/fonts.css: 1494509091
xxxx/view/fonts/garamondcondot-book/fonts.css: 1494509092
xxxx/view/fonts/gotham-narrow/fonts.css: 1494509092
xxxx/view/fonts/gotham/fonts.css: 1494509092
xxxx/view/fonts/greatvibes/fonts.css: 1494509092
xxxx/view/fonts/indie-flower/fonts.css: 1494509092
xxxx/view/fonts/katibeh/fonts.css: 1494509092
xxxx/view/fonts/lobster-two/fonts.css: 1494509092
xxxx/view/fonts/museo/fonts.css: 1494509092
xxxx/view/fonts/myriad-pro/fonts.css: 1494509092

这些时间戳不正确,因此我需要使用以下命令使用 git log 检查正确的上次编辑时间戳:

git log -1 --pretty="format:%ct" xxxx/view/css/animate.css/3.1.1/animate.min.css

问题是我有超过 500-600 个文件需要检查和替换正确的时间戳。我尝试过 awk、sed 但效果不好。 这是我的例子:

variables=$(git log -1 --pretty="format:%ct") 

     while read line ; do
         replacement="$variables $line"
         sed 's/,.*:/ $replacement/' <<< "$line"
     done < files.yml

另一个:

  file="files2.yml"
  files=$(cat files.yml | awk '{print $1}' | cut -d ':' -f 1)
  for i in $files;do
    new=$(git log -1 --pretty="format:%ct" $i)
    sed "s/    .*:/ $new/" files2.yml
  done

你有什么建议吗?

最佳答案

sed -E 's|(.*): .*|echo \x27\1\x27: $(git log -1 --pretty="format:%ct" "\1")|e' files.yml
  • (.*): .* 将捕获最后一个 : 之前的文本和行中的空格,并匹配行的其余部分
  • echo\x27\1\x27: 将文件路径放回原处,\1 将引用与 (.*) 匹配的文本> 和 \x27 是单引号字符
  • $(git log -1 --pretty="format:%ct""\1") 你要执行的命令
  • e 标志允许将整个修改行作为 shell 命令执行(不确定这是否特定于 GNU sed,但问题被标记为 linux 所以这应该没问题)

请注意,这不是一个可靠的命令。包含空格和其他 shell 元字符的文件名可能会导致问题。

关于linux - 从 git log 输出中替换文件中的第二个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62020320/

相关文章:

linux - nginx 配置中的访问权限

c - elf .rel.text 部分 R_386_32/R_386_PC32 的含义

node.js - 为什么我无法安装特定版本的 npm 以及如何安装?

Linux - 将部分输出重定向到文件

bash - 在 Mac 终端使用 for 循环打印每个文件名的字符数

linux - 循环读取 bash 文件中的多个查询

linux - 删除特定单词之间带有 VIM 的 .txt 的内容

git 从历史记录中删除 merge 提交

git - 设置对 git repo 的只读 http 访问

git - 如果特定文件发生更改,我如何自动收到警告?