Com um único arquivo de entrada que contém apenas comentários (começando com #) e VARIABLE = linhas de valor, é possível substituir um valor por uma única variável se encontrada e, caso contrário, anexar o par ao final do arquivo se não for encontrado?
Meu método atual funciona excluindo-o em uma primeira passagem e, em seguida, anexando-o ao final do arquivo em uma segunda passagem, mas esse método altera a ordem das linhas (e também possui dois comandos diferentes):
sed -r "/^FOOBAR=.*$/d" -i samefile &&
sed -r "$ a\FOOBAR=newvalue" -i samefile
Existe alguma maneira de fazer isso, ie. mantendo a ordem da linha, em uma única linha sed? Se algum outro utilitário (awk, ...) fizer isso, eu assumirei o comando sed.
fonte
newvalue
fosse armazenado em uma variável?sed "/^${varName}=/{h;s/=.*/=${varValue}/};\${x;/^$/{s//${varName}=${varValue}/;H};x}" ${VARFILE}
com variáveis, aspas duplas para permitir a substituição de variáveis$
$$varName
sed "/^${varName}=/{h;s/=.*/=${!varName}/};\${x;/^$/{s//${varName}=${!varName}/;H};x}" ${VARFILE}
Provavelmente isso pode ser reduzido. Não é um comando sed único e também usa grep, mas parece ser basicamente o que você está querendo. É uma única linha e edita o arquivo no local (sem arquivos temporários).
fonte
Aqui está um mais simples
sed
abordagem , pois não achosed
hold space
fácil trabalhar. Se você estiverhold space
familiarizado, o uso da abordagem don_crissti oferece uma oportunidade adicional de preservar qualquer coisa da linha existente, mas isso geralmente é muito raro.Nesta abordagem, você apenas imprime tudo, menos a linha que deseja soltar e, no final, anexa a substituição.
fonte
Com base nas outras respostas, se o que você deseja fazer é substituir o valor de uma variável, se essa variável estiver presente no arquivo, e anexá-la ao final do arquivo, se não estiver (o que não é o que seus
sed
comandos publicados fazem), você poderia tentar o seguinte:fonte
É um pouco mais fácil no awk, embora a "edição no local" não seja automática:
fonte
Basta usar
grep
eecho
para criar um registro vazio:Cada linha escapa com o código de erro zero.
fonte
grep
eecho
Na verdade, funciona com o seguinte:
sed -i '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infile
Na resposta escolhida -i está ausente.fonte
fazer isso com perl e no local isso funciona bem para mim:
fonte
grep
eecho
eperl
em vez de fazer tudo emperl
? Além disso, escrevendo em um arquivo (>> my.file
) como você está lendo (grep my.file
)?