edita o arquivo repo com sed

3

Eu quero editar manualmente o meu arquivo repo a partir da linha de comando, de preferência usando sed . Como posso fazer isso com base no nome do repo que quero editar?

Eu quero pesquisar um nome de repositório específico (exemplo: reponame-2) e, com base nessa alteração, por exemplo, a opção enabled=1 to 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_
    
por Asaf Magen 15.06.2016 / 19:12

3 respostas

4

O "modo de parágrafo" de Perl, onde "linhas" são definidas por novas linhas consecutivas, é perfeito para isso:

$ 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_

Ou para editar o arquivo original diretamente:

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

Como alternativa, você pode usar 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_

E, se você tiver uma versão recente do GNU-awk ou de qualquer outra awk suporting -i , poderá fazer isso para editar:

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

Como alternativa, para evitar as linhas em branco extras que o awk acima adiciona ao final do arquivo, você poderia fazer algo mais complexo como:

$ 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_
    
por 15.06.2016 / 19:23
2

Algo parecido com isto:

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

Isso requer que enabled= esteja sempre na terceira linha após o nome do repositório.

    
por 15.06.2016 / 19:24
2

Com awk , é possível definir um separador de registro para duplicar novas linhas para, de alguma forma, simular o modo de parágrafo de perl , como em resposta de terdon :

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