Manière la plus simple de commenter / décommenter certaines lignes à l'aide de la ligne de commande

37

Existe-t-il un moyen de commenter / de commenter un script shell / config / ruby ​​en ligne de commande?

par exemple:

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

cela ajouterait ou supprimerait la #connexion bla.confen ligne 14à 18. Normalement, je l’utilise sed, mais je dois connaître le contenu de ces lignes, puis effectuer une opération de recherche / remplacement, ce qui donnerait un résultat erroné s’il ya plus d’une aiguille (et nous ne voulons que remplacer le N-ème une).

Kokizzu
la source
1
Il y a un A à ce Q intitulé: décommentant plusieurs lignes de code, spécifié par les numéros de ligne, en utilisant vi ou vim qui montre de nombreuses méthodes pour ce faire à l' aide sed, perletc. Plus précisément A par terdon!
slm

Réponses:

46

Pour commenter les lignes 2 à 4 de bla.conf:

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

Pour faire la commande que vous vouliez, il suffit de mettre ce qui précède dans un script shell appelé comment:

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

Ce script est utilisé de la même façon que le vôtre, sauf que les première et dernière lignes doivent être séparées par une virgule plutôt que par un tiret. Par exemple:

comment 2,4 bla.conf

Une commande de suppression de commentaire peut être créée de manière analogue.

Fonctionnalité avancée

sedLa sélection de ligne de est assez puissante. En plus de spécifier la première et la dernière ligne par numéro, il est également possible de les spécifier par une expression régulière. Donc, si vous voulez commander toutes les lignes de celle qui contient fooà celle qui contient bar, utilisez:

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

Systèmes BSD (OSX)

Avec BSD sed, l' -ioption nécessite un argument, même s'il ne s'agit que d'une chaîne vide. Ainsi, par exemple, remplacez la commande supérieure ci-dessus par:

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

Et, remplacez la commande dans le script par:

sed -i '' "$1"' s/^/#/' "$2"
John1024
la source
1
Le double 'après l' -ioption est-il intentionnel? Je n'ai pas besoin d'eux
raphinesse
8

Avec GNU sed (pour remplacer les fichiers en place avec l’ -ioption):

sed -i '14,18 s/^/#/' bla.conf
sed -i '14,18 s/^##*//' bla.conf
Gilles, arrête de faire le mal
la source
2

Vous pouvez utiliser Vim en mode Ex:

ex -sc 'g/^\s*[^#]/s/^/#/' -cx bla.conf
ex -sc 'g/^\s*#/s/#//' -cx bla.conf
  1. g regex global

  2. s remplacer

  3. x sauver et fermer

Steven Penny
la source
2

Vous pouvez créer un fichier bash avec des fonctions pour le réutiliser dans vos projets.

#!/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
Jan
la source