Adicione uma linha abaixo de cada linha que corresponda a um padrão apenas se ainda não estiver presente

3

Pode sed adicionar uma nova linha abaixo de um conteúdo específico, se o conteúdo de entrada existir, então, deixe?

Conteúdo atual do arquivo ssss

Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6

Conteúdo desejado do arquivo ssss

Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6
apache 4.2

Eu posso adicionar o conteúdo com o comando abaixo

sed -i '/Os version rhel5.6/a apache 4.2' ssss

Minha pergunta

Eu quero adicionar uma linha abaixo de um conteúdo especificado se o conteúdo existir no arquivo e, em seguida, sair dele. Se o conteúdo não existir, adicione-o.

    
por Mongrel 24.06.2016 / 09:50

2 respostas

2

Esta expressão perl fará o truque,

perl -i -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss

Explicação

  • next if /apache 4.2/ ignora as linhas correspondentes a apache 4.2 .
  • s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print search Os version rhel5.6 e substitui a linha pelo mesmo com apache 4.2 na nova linha.

Teste com seu arquivo de entrada

$ cat ssss
Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6

$ perl -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss
Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6
apache 4.2
    
por 24.06.2016 / 10:08
2

Aqui está uma maneira de fazer isso com sed :

sed '/Os version rhel5\.6/{
a\
apache 4.2
$!{
n
/^apache 4\.2$/d
}
}' infile

Isso anexa apache 4.2 incondicionalmente a todas as linhas correspondentes a Os version rhel5.6 (se não na última linha) ele puxa a próxima linha via n (imprimindo o espaço padrão) e se o novo conteúdo do espaço padrão corresponder a apache 4.2 exclui. Ajustar o regex, se necessário, para incluir espaços iniciais / finais, por exemplo /^[[:blank:]]*apache 4\.2[[:blank:]]*$/d

    
por 24.06.2016 / 11:31