Preciso adicionar a seguinte linha ao final de um arquivo de configuração:
include "/configs/projectname.conf"
para um arquivo chamado lighttpd.conf
Estou pensando em usar sed
para fazer isso, mas não consigo descobrir como.
Como inseri-lo apenas se a linha ainda não existir?
crudini
pode ser uma opção boa (mas não para lighthttpd até o momento)Respostas:
Basta mantê-lo simples :)
grep + echo deve ser suficiente:
-q
fique quieto-x
coincidir com a linha inteira-F
padrão é uma string simplesEdit: incorporou @cerin e @ thijs-wouters sugestões .
fonte
grep -vq ...
echo
para acionar umcat
heredoc de várias linhas em um arquivo de configuração.-s
para ignorar erros quando o arquivo não existir, criando um novo arquivo com apenas essa linha.Essa seria uma solução limpa, legível e reutilizável, usando
grep
eecho
adicionando uma linha a um arquivo apenas se ele ainda não existir:Se você precisar coincidir com toda a linha, use
grep -xqF
Adicione
-s
para ignorar erros quando o arquivo não existir, criando um novo arquivo com apenas essa linha.fonte
sudo grep -qF "$LINE" "$FILE" || echo "$LINE" | sudo tee -a "$FILE"
-
.--
o comando grep, para que ele não interprete mais um $ LINE começando com um traço como opções.Aqui está uma
sed
versão:Se sua string estiver em uma variável:
fonte
sed -i -e '\|session.*pam_mkhomedir.so|h; ${x;s/mkhomedir//;{g;tF};a\' -e 'session\trequired\tpam_mkhomedir.so umask=0022' -e '};:F;s/.*mkhomedir.*/session\trequired\tpam_mkhomedir.so umask=0022/g;' /etc/pam.d/common-session
sed
há anos, mas principalmente apenas os
comando. As trocas de espaçohold
epattern
estão além de mim.Se estiver gravando em um arquivo protegido, as respostas de @drAlberT e de rubo77 podem não funcionar para você, pois não é possível sudo
>>
. Uma solução igualmente simples , então, seria usartee --append
(ou, no MacOStee -a
):fonte
Se, um dia, alguém tiver que lidar com esse código como "código herdado", essa pessoa ficará agradecida se você escrever um código menos exotérico, como
fonte
outra solução sed é sempre anexá-la na última linha e excluir uma pré-existente.
"escapado corretamente" significa colocar uma regex que corresponda à sua entrada, ou seja, escapar de todos os controles regex da sua entrada real, ou seja, colocar uma barra invertida na frente de ^ $ / *? + ().
isso pode falhar na última linha do seu arquivo ou, se não houver uma nova linha pendente, não tenho certeza, mas isso pode ser resolvido por algumas ramificações bacanas ...
fonte
sed -i.bak -e '$a\' -e "$NEW_IP\t\t$HOST.domain\t$HOST" -e "/.*$HOST/d" /etc/hosts
sed -i -e '/<entry>/d; $a <entry>'
d
comando reiniciará o programa sed e, assim, pulará oa
ppend, se a exclusão estiver na última linha.a
ppend tem que ser executado antesd
elete:sed -i -e '$a<entry>' -e '/<entry>/d'
. É quase o mesmo que sua resposta original.use awk
fonte
file file
porque ele faz duas passagens sobre o mesmo arquivo.NR==FNR
é verdade na primeira passagem, mas não na segunda. Este é um idioma comum do Awk.As respostas usando grep estão erradas. Você precisa adicionar uma opção -x para coincidir com a linha inteira, caso contrário, linhas como
#text to add
ainda corresponderão ao procurar adicionar exatamentetext to add
.Portanto, a solução correta é algo como:
fonte
Usando sed: Ele será inserido no final da linha. Você também pode passar variáveis como de costume, é claro.
Usando oneliner sed
Usar o eco pode não funcionar como root, mas funcionará assim. Mas isso não permitirá que você automatize as coisas, se estiver procurando fazê-lo, pois pode solicitar senha.
Eu tive um problema ao tentar editar da raiz para um usuário específico. Apenas adicionar o
$username
antes foi uma correção para mim.fonte
Eu precisava editar um arquivo com permissões de gravação restritas, conforme necessário
sudo
. trabalhando a partir da resposta de ghostdog74 e usando um arquivo temporário:fonte