4 votos

Cómo buscar texto y reemplazar esa línea si existe con terminal de lo contrario anexar línea para poner fin a

Quiero poner en sudo gedit /etc/sysctl.conf la línea vm.swappiness=10 que a veces me cambio.

Por defecto, esta línea no existe, así que uso echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf.

Si yo siempre iba a poner exactamente la misma línea vm.swappiness=10, a continuación, en caso de que desee reemplazar podría utilizar sudo sed -i 's/vm.swappiness=10/vm.swappiness=1/g' /etc/sysctl.conf , Pero como no podía ser de vm.swappiness=12 o algo más, quiero--con un solo comando-para ver si, en /etc/sysctl.conf, existe una línea que comienza vm.swappiness=. Entonces, si no existe quiero quitar toda la línea (a continuación, anexando && echo "vm.swappiness=1" | sudo tee -a /etc/sysctl.conf a ese comando, también, posteriormente, agregar la nueva línea de configuración que quiero hasta el final.

Pero de nuevo, como no podría ser un montón de diferentes parámetros en una línea, no sería bueno para borrar todo, pero sería mejor cambiar sólo el número (a la derecha inmediata de vm.swappiness=).

¿Qué te parece? Sería mejor buscar vm.el swappiness=x(x(x)) con 1 a 3 números (por supuesto, 100 también existe...), reemplace si es que existe (por ponerlo en una variable y, usando un comando como `sudo sed -i 's/$oldline/$newline/g'), y si no, entonces sólo anexar vm.swappiness=10?

6voto

lgarzo Puntos 7949

Usted puede hacer estos cambios, con awk.

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

El nombre de archivo de parámetro al final es el nombre del archivo de texto que contiene las líneas.

El comando anterior sustituye a cualquier línea que comience con wm.swappiness con replacement (modificar a su necesidad). De lo contrario, imprime las líneas originales.

Si el reemplazo se hizo, es recordado en la found variable. Por lo tanto, si no se reemplaza, el END bloque añade una línea con el appended cadena (esto también debe ser modificado).

(Por favor, tenga en cuenta que no estoy teniendo en cuenta los permisos, esta es la solución de sólo la sustitución o anexar problema).

3voto

Benoît Legat Puntos 373

Se puede utilizar

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

Si no te importa cuántos dígitos tiene el número.

Si eres sur desea no más de 3 dígitos, necesita extendida expresión regular (moderno) en lugar de las expresiones regulares básicas (BRE). Entonces debe proporcionar la "-E" parámetro

sed -E 's/vm.swappiness=[0-9]{1,3}/vm.swappiness=1/g' /etc/sysctl.conf

0voto

Fu86 Puntos 116

Estoy haciendo:

( 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

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: