Asa*_*gen 4 sed text-processing repository
我想从命令行手动编辑我的 repo 文件,最好使用sed. 我怎样才能根据我要编辑的回购名称来做到这一点?
我要搜索某个特定reponame(例如: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_
Run Code Online (Sandbox Code Playgroud)
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)