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