La forma más simple de comentar / descomentar ciertas líneas usando la línea de comando

37

¿Hay alguna manera de comentar / descomentar un script shell / config / ruby ​​usando la línea de comando?

por ejemplo:

$ comment 14-18 bla.conf
$ uncomment 14-18 bla.conf

esto agregaría o eliminaría el #inicio de sesión bla.confen línea 14para 18. Normalmente lo uso sed, pero debo conocer el contenido de esas líneas y luego hacer una operación de búsqueda y reemplazo, y eso daría un resultado incorrecto cuando hay más de una aguja (y solo queremos reemplazar la N-ésima uno).

Kokizzu
fuente
1
Hay una A de esta Q titulada: descomentando múltiples líneas de código, especificado por los números de línea, usando vi o vim que muestra muchos métodos para hacer esto utilizando sed, perl, etc. Específicamente la A por terdon!
slm

Respuestas:

46

Para comentar las líneas 2 a 4 de bla.conf:

sed -i '2,4 s/^/#/' bla.conf

Para hacer el comando que desea, simplemente coloque lo anterior en un script de shell llamado comentario:

#!/bin/sh
sed -i "$1"' s/^/#/' "$2"

Este script se usa igual que el suyo, con la excepción de que la primera y la última línea deben estar separadas por una coma en lugar de un guión. Por ejemplo:

comment 2,4 bla.conf

Se puede crear un comando sin comentar de forma análoga.

Característica avanzada

sedLa selección de línea es bastante poderosa. Además de especificar la primera y la última línea por número, también es posible especificarlas mediante una expresión regular. Entonces, si desea ordenar todas las líneas desde la que contiene fooa la que contiene bar, use:

comment '/foo/,/bar/' bla.conf

Sistemas BSD (OSX)

Con BSD sed, la -iopción necesita un argumento incluso si es solo una cadena vacía. Así, por ejemplo, reemplace el comando superior anterior con:

sed -i '' '2,4 s/^/#/' bla.conf

Y, reemplace el comando en el script con:

sed -i '' "$1"' s/^/#/' "$2"
John1024
fuente
1
¿El doble 'después de la -iopción es intencional? No los necesitaba.
raphinesse
8

Con GNU sed (para reemplazar los archivos en su lugar con la -iopción):

sed -i '14,18 s/^/#/' bla.conf
sed -i '14,18 s/^##*//' bla.conf
Gilles 'SO- deja de ser malvado'
fuente
2

Puede usar Vim en modo Ex:

ex -sc 'g/^\s*[^#]/s/^/#/' -cx bla.conf
ex -sc 'g/^\s*#/s/#//' -cx bla.conf
  1. g expresión regular global

  2. s sustituir

  3. x guardar y cerrar

Steven Penny
fuente
2

Puede crear un bash_file con funciones para reutilizarlo en sus proyectos

#!/bin/bash

# your target file
CONFIG=./config.txt

# comment target
comment() {
  sed -i '' "s/^$1/#$1/" $CONFIG
}

# comment target
uncomment() {
  echo $1
  sed -i '' "s/^#$1/$1/" $CONFIG
}


# Use it so:
uncomment enable_uart
comment arm_freq
ene
fuente