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

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

Pode sedadicionar uma nova linha abaixo de um conteúdo específico, se o conteúdo de entrada existir, deixe-o?

Conteúdo atual do arquivossss

Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6

Conteúdo desejado do arquivossss

Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6
apache 4.2

Consigo adicionar o conteúdo com o comando abaixo

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

Minha pergunta

Quero adicionar uma linha abaixo de um conteúdo especificado, se o conteúdo existir no arquivo, deixe-o. Se o conteúdo não existir, adicione-o.

Responder1

Esta perlexpressão resolverá o problema,

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/pula todas as linhas correspondentes apache 4.2.
  • s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; printpesquise Os version rhel5.6e substitua a linha pela mesma com acréscimo apache 4.2em 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

Responder2

Aqui está uma maneira de fazer isso sed:

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

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

informação relacionada