【问题标题】:Bash Makefile update comments?Bash Makefile 更新评论?
【发布时间】:2020-06-02 15:09:45
【问题描述】:

我需要制作一个 shellscript 来更新项目的 C 源代码文件中的 cmets。我还需要向 Makefile 添加一个新目标,以便更新 Makefile 本身的版本号。我将收到一个(未知名称)zip 文件,其中包含多个文件(名为:calcmarks.h、calcmarks.c、correlation.c、globals.c、readmarks.c)。这是我目前拥有的,但对如何完成这项工作感到非常困惑

unzip $1 
for file in calcmarks.h calcmarks.c correlation.c globals.c readmarks.c  
do                                                                                                                 
e=`grep -oP '(?<= version )[0-9]+' file`                                                                             
let f=$e+1                                                                                                           
sed "s/version $e,/version $f, /" file  | sed "s/released.*/released $(date)/" > file                                
done      

我以为我的 shellscript 会解压缩文件夹,然后对于每个文件,它会找到注释,用更新的版本号替换版本号,然后用当前日期替换旧日期,但它不起作用。我也不确定如何在 Makefile 中创建一个新目标来更新 Makefile 本身中的注释。谢谢!

【问题讨论】:

    标签: c bash makefile


    【解决方案1】:

    问题出在一行

    sed "s/version $e,/version $f, /" file  | sed "s/released.*/released $(date)/" > file
    

    因为您正在读取您正在写入的同一个文件。由于重定向,您在开始阅读的同时清空文件以写入新内容。

    这会解决这个问题:

    mv file file.bak
    sed "s/version $e,/version $f, /" file.bak  | sed "s/released.*/released $(date)/" > file
    rm file.bak
    

    但这会更干净:

    sed -i "s/version $e,/version $f, /; s/released.*/released $(date)/" file
    

    【讨论】:

    • 为了清楚起见,它在技术上是最后的重定向:&gt; file 清空文件而不是管道命令本身。当您重定向(不附加)到文件时,该文件立即被截断为 0 长度,并且由于并行调用管道中的所有命令,重定向会截断文件,因为第一个 sed 正在尝试读取它。
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 2020-05-03
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多