使用 sed 编辑 repo 文件

使用 sed 编辑 repo 文件

我想从命令行手动编辑我的存储库文件,最好使用sed.如何根据我想要编辑的存储库名称来做到这一点?

我想搜索特定的存储库名称(例如:reponame-2)并基于该更改,例如,enabled=1选项enabled=0

[repo-name1]
name=repo-name1
baseurl=http://linktomyrepo.com
enabled=1
sslverify=0
proxy=_none_


[repo-name2]
name=repo-name2
baseurl=http://linktomyrepo.com
enabled=1
sslverify=0
proxy=_none_

答案1

Perl 的“段落模式”(其中“行”由连续的换行符定义)非常适合此目的:

$ perl -00pe 's/enabled=1/enabled=0/ if /\[repo-name1/' file [repo-name1]
name=repo-name1
baseurl=http://linktomyrepo.com
enabled=0
sslverify=0
proxy=_none_


[repo-name2]
name=repo-name2
baseurl=http://linktomyrepo.com
enabled=1
sslverify=0
proxy=_none_

或者,直接编辑原始文件:

perl -i -00pe 's/enabled=1/enabled=0/ if /\[repo-name1/' file 

或者,您可以使用awk

$ awk -vRS='\n\n' -vORS='\n\n' '/\[repo-name1/{sub(/enabled=1/,"enabled=0")}1;' file 
[repo-name1]
name=repo-name1
baseurl=http://linktomyrepo.com
enabled=0
sslverify=0
proxy=_none_

[repo-name2]
name=repo-name2
baseurl=http://linktomyrepo.com
enabled=1
sslverify=0
proxy=_none_

而且,如果您有最新版本的 GNU-awk 或任何其他awk支持-i,您可以执行以下操作来就地编辑:

awk -iinplace -vRS='\n\n' -vORS='\n\n' '/\[repo-name1/{sub(/enabled=1/,"enabled=0")}1;' file 

awk或者,为了避免上面添加到文件末尾的额外空行,您可以执行更复杂的操作,例如:

$ awk -F= '/\[repo-name1/{a=1}/^\s*$/{a=0}a==1 && $1=="enabled"{$2=0}1;' file
[repo-name1]
name=repo-name1
baseurl=http://linktomyrepo.com
enabled 0
sslverify=0
proxy=_none_

[repo-name2]
name=repo-name2
baseurl=http://linktomyrepo.com
enabled=1
sslverify=0
proxy=_none_

答案2

像这样的东西:

sed -i '/repo-name1/{n;n;n;s/enabled=1/enabled=0/}' repos.txt

这要求enabled=始终位于存储库名称之后的第三行。

答案3

可以awk将记录分隔符设置为双换行符,以某种方式模拟perl的段落模式,如下所示特登的回答:

awk 'BEGIN{RS="\n\n";OFS="\n"} \
     /repo-name1/{for(i=1;i<=NF;i++) if($i=="enabled=1") $i="enabled=0"}1' file

相关内容