Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用bash将从文本文件中删除的行复制回其原始文件中_Linux_Bash_Shell_Github - Fatal编程技术网

Linux 使用bash将从文本文件中删除的行复制回其原始文件中

Linux 使用bash将从文本文件中删除的行复制回其原始文件中,linux,bash,shell,github,Linux,Bash,Shell,Github,在GitHub存储库中,我有大约一百个自动生成的文件,这些文件带有注释头,用于指定生成日期、版本等内容 问题在于,通常情况下,头会更改,但文件的实际有用内容不会更改。 当这种情况发生时,GitHub报告了大约100个更改的文件,而实际上可能只有几个文件发生了更改。这使得我们很难发现真正的变化 不幸的是,由于与当前问题无关的原因,这些标题必须在发布时出现。否则,我就把它们去掉,了结了 为了解决这个问题,我的计划是: 在将注释标题提交到存储库之前,从文件中删除注释标题并将其保存到单独的文件中 作为J

在GitHub存储库中,我有大约一百个自动生成的文件,这些文件带有注释头,用于指定生成日期、版本等内容

问题在于,通常情况下,头会更改,但文件的实际有用内容不会更改。 当这种情况发生时,GitHub报告了大约100个更改的文件,而实际上可能只有几个文件发生了更改。这使得我们很难发现真正的变化

不幸的是,由于与当前问题无关的原因,这些标题必须在发布时出现。否则,我就把它们去掉,了结了

为了解决这个问题,我的计划是:

  • 在将注释标题提交到存储库之前,从文件中删除注释标题并将其保存到单独的文件中
  • 作为Jenkins管道中的一个步骤,在发布时将头重新合并到文件中
  • 对于计划的第一部分,我将剥离文件的前5行,并将它们保存到单个versions.txt文件中

    我正在处理的原始文件(*.h)的格式如下

    /* Some comment */
    /* More useless text */
    /* Version of the file */
    /* Maybe a date */
    /* More comment */
    
    Actual useful file content
    
    我使用以下命令

    head-5*.h>versions.txt&&sed-i'1,+4d'*.h
    
    要从每个文件中删除前5行并创建一个versions.txt文件,该文件的最终外观如下所示:

    ==> File1.h <==
    /* Some comment */
    /* More useless text */
    /* Version of the file */
    /* Maybe a date */
    /* More comment */
    
    ==> File2.h <==
    /* Some comment */
    /* More useless text */
    /* Version of the file */
    /* Maybe a date */
    /* More comment */
    
    ==> File3.h <==
    /* Some comment */
    /* More useless text */
    /* Version of the file */
    /* Maybe a date */
    /* More comment */
    
    ==>File1.h File2.h File3.h尝试以下解决方案:

     awk '/^==>/ { cnt=1;filname=$2 } { print "sed -i \""cnt"i "$0"\" "filname;cnt++ }' version.txt
    
    搜索以“=>”开头的行,并将第二个空格分隔的字段设置为变量名。这将继续进行,直到下一个“==>”用于创建一个sed命令,以在文件顶部插入行,使用cnt to terack在文件中的何处插入行

    一旦您对上述命令按预期打印sed命令感到满意(非常重要!),您就可以使用awk的系统功能执行这些命令,因此:

     awk '/^==>/ { cnt=1;filname=$2 } { system("sed -i \""cnt"i "$0"\" "filname);cnt++ }' version.txt
    

    Raman Sailopal的回答切中要害,除了几个细节:

  • 该命令还将插入
    =>Filename versions.txt&&sed-i'1,+4d'*.h
  • 该命令不会插入空行
  • 该命令在额外的空行上工作,该空行由原始剥离命令作为文件之间的分隔符插入
  • 因此,我用
    if
    语句扩展了提供的命令,以便


  • 只有当
    cnt>1&&cnt<7
    使其在五行上工作时才运行,而忽略了第一个
    ==>文件名,那么为什么要删除它们,而不是简单地复制所需的信息?我删除它们是因为我需要,在GitHub中,它们会创建一大堆让开发人员烦恼的更改。但在发布时,我想把它们放回我的Jenkins管道。这是显而易见的,但如果以后需要它们,为什么要删除它们???对不起,我误解了为什么要删除它们。我删除它们是因为我需要,在GitHub中,它们创建了一大堆让开发人员烦恼的更改。但在发布时,我想把它们放回我的Jenkins管道。例如,我删除的一些注释包含文件自动生成的日期和时间,但文件的有用内容保持不变。GitHub的目标是不告诉我1000个文件已经更改,而唯一更改的是我要删除的标题部分中的日期和时间。
    
    awk '/^==>/ { cnt=1;filename=$2 } 
    { if(cnt > 1 && cnt < 7 && $0 == "") system("sed -i \""cnt-1"G\" " filename)} 
    { if(cnt > 1 && cnt < 7 && $0 != "") system("sed -i \""cnt-1"i "$0"\" "filename);cnt++}' versions.txt