我想从命令行手动编辑我的存储库文件,最好使用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