使用 sed 编辑 repo 文件

Asa*_*gen 4 sed text-processing repository

我想从命令行手动编辑我的 repo 文件,最好使用sed. 我怎样才能根据我要编辑的回购名称来做到这一点?

我要搜索某个特定reponame(例如:reponame-2)和基于这种变化,例如,可以选择enabled=1enabled=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_
Run Code Online (Sandbox Code Playgroud)

ter*_*don 5

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_
Run Code Online (Sandbox Code Playgroud)

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

perl -i -00pe 's/enabled=1/enabled=0/ if /\[repo-name1/' file 
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用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_
Run Code Online (Sandbox Code Playgroud)

而且,如果您有最新版本的 GNU-awk 或任何其他awk支持的-i,您可以这样做以进行适当的编辑:

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

或者,为了避免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_
Run Code Online (Sandbox Code Playgroud)