Como localizar o texto e substituir essa linha se existir com o terminal, caso contrário, basta anexar a linha ao final

4

Eu quero colocar em sudo gedit /etc/sysctl.conf a única linha vm.swappiness=10 que às vezes mudo.

Por padrão, esta linha não existe, então eu uso echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf .

Se eu sempre colocasse a mesma linha exata vm.swappiness=10 , no caso de querer substituir, poderia usar sudo sed -i 's/vm.swappiness=10/vm.swappiness=1/g' /etc/sysctl.conf Mas , pois poderia haver vm.swappiness=12 ou outra coisa, quer - com apenas um único comando - para descobrir se, em /etc/sysctl.conf , existe linha iniciando vm.swappiness= . Então, se ele existir, eu quero remover a linha inteira (em seguida, anexando && echo "vm.swappiness=1" | sudo tee -a /etc/sysctl.conf a esse comando, ele também adicionará posteriormente a nova linha de configuração que eu quero ao final.

Mas novamente, pois pode haver muitos parâmetros diferentes em uma linha, não seria bom excluir tudo, mas seria melhor alterar apenas o número (à direita imediata de vm.swappiness= ).

O que você acha? Seria melhor procurar vm.swappiness = x (x (x)) com 1 a 3 números (é claro, 100 também existe ...), substituir se estiver lá (colocando-o em uma variável e usando um comando como 'sudo sed -i 's/$oldline/$newline/g' ), e se não, basta anexar vm.swappiness=10 ?

    
por Kangarooo 08.11.2011 / 16:18

3 respostas

3

Você pode usar

sed 's/vm.swappiness=[0-9]*/vm.swappiness=1/g' /etc/sysctl.conf

se você não se importa com quantos dígitos seu número tem.

Se você quer mais do que 3 dígitos, você precisa de expressões regulares estendidas (modernas) ao invés de expressões regulares básicas (BRE's). Você precisa então fornecer o parâmetro "-E"

sed -E 's/vm.swappiness=[0-9]{1,3}/vm.swappiness=1/g' /etc/sysctl.conf
    
por Benoît Legat 22.11.2011 / 19:23
6

Você pode fazer essas substituições com o awk .

awk '/^vm.swappiness/ {print "replacement"; found=1} !/^vm.swappiness/ {print $0} END {if (!found) {print "appended" }}' filename

O parâmetro filename no final é o nome do arquivo de texto que contém as linhas.

O comando acima substitui qualquer linha que comece com wm.swappiness com replacement (modifique a sua necessidade). Caso contrário, imprimirá as linhas originais.

Se uma substituição foi feita, ela é lembrada na variável found . Assim, se nenhuma substituição foi feita, o bloco END anexa uma linha com a string appended (isso também deve ser modificado).

(Por favor, note que eu não estou levando em conta as permissões, isso está resolvendo apenas o problema de substituição ou acréscimo).

    
por lgarzo 08.11.2011 / 16:52
0

Estou fazendo:

( sysctl vm.swappiness=10 ) > /dev/null

if [[ 'grep "vm.swappiness=" /etc/sysctl.conf | wc -l' -eq 0 ]]; then
    echo "vm.swappiness=60" >> /etc/sysctl.conf
fi

sed -i -r 's~^vm.swappiness[[:blank:]]*=[[:blank:]]*[0-9]*$~vm.swappiness=10~' /etc/sysctl.conf
    
por Alix Axel 17.05.2013 / 22:01