Pode sed
adicionar 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 perl
expressã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 correspondentesapache 4.2
.s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print
pesquiseOs version rhel5.6
e substitua a linha pela mesma com acréscimoapache 4.2
em 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.2
incondicionalmente 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