como editar a próxima linha após o padrão de correspondência e anexar a linha se não existir

1

Estou procurando alterar um conteúdo de arquivo que é repetido duas vezes com essa substituição. Quero adicionar uma linha extra ao segundo conteúdo no mesmo arquivo

Arquivo de exemplo

User YOURNAME
IdentityFile ~/.ssh/YOURKEY

.
.
.
User YOURNAME
Installing
Installing

Exemplo de saída depois de executar o script

User adminuser
IdentityFile ~/.ssh/id_rsa

.
.
.
User adminuser
IdentityFile ~/.ssh/id_rsa
Installing
Installing

Eu posso alterar o user e o YOURKEY com o comando abaixo sed

'sed- i s/"YOURNAME/adminuser"/g /root/.ssh/config'
'sed -i 's/YOURKEY/id_rsa/g' ff1'

Mas não consigo inserir IdentityFile ~/.ssh/id_rsa na próxima linha.

editado

informações adicionais ****User adminuser estão ocupando espaço no começo da linha. Esses arquivos estão sendo sincronizados em bases diárias, portanto não é possível remover IdentityFile line. Após a sincronização, ele será substituído

Edição final que funciona conforme necessário

perl -i -ne 'next if /IdentityFile/; 
            s#YOURNAME#adminuser\n    IdentityFile ~/.ssh/id_rsa#; 
            print' filename
    
por Mongrel 10.06.2016 / 10:40

2 respostas

1

Basta remover todos os casos de IdentityFile e adicioná-los novamente explicitamente:

$ perl -i -ne 'next if /IdentityFile/; 
            s#YOURNAME#adminuser\nIdentityFile ~/.ssh/id_rsa#; 
            print' file
$ cat file
User adminuser
IdentityFile ~/.ssh/id_rsa

.
.
.
User adminuser
IdentityFile ~/.ssh/id_rsa
Installing
Installing

O next if /IdentityFile/ ignora as linhas correspondentes a IdentityFile . O s#YOURNAME#adminuser\nIdentityFile ~/.ssh/id_rsa# substituirá qualquer instância de YOURNAME por adminuser , uma nova linha e a linha IdentityFile . O% final print imprime todas as linhas.

    
por 10.06.2016 / 12:50
1

Parte do problema é que seu modelo é inconsistente: a primeira ocorrência tem uma linha IdentityFile , enquanto a segunda não . Você pode torná-lo consistente primeiro excluindo as linhas IdentityFile existentes e adicionando as linhas desejadas.

Para excluir linhas:

sed -i '/^IdentityFile /d' filename

Para adicionar linhas, você pode fazer isso em sed , combinando a linha User , e adicionando uma linha, por exemplo,

sed -e '/^User /'a'\
IdentityFile ~/.ssh/id_rsa' filename
    
por 10.06.2016 / 10:52