web-dev-qa-db-fra.com

Comment comment décommenter une ligne qui contient une chaîne spécifique en utilisant Sed?

Les lignes du fichier:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2000 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2001 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2002 -j ACCEPT

pour commenter disons la ligne qui contient

2001

je peux simplement exécuter cette commande SED:

sed -i '/ 2001 /s/^/#/' file

mais maintenant comment revenir en arrière?

comme en commentant cette même ligne?

j'ai essayé

sed -i '/ 2001 /s/^//' file

cela ne fonctionne pas.

42
user3864928

Essayez cette commande sed,

sed -i '/^#.* 2001 /s/^#//' file
46
Avinash Raj

Oui, pour commenter une ligne contenant une chaîne spécifique avec sed, faites simplement:

sed -i '/<pattern>/s/^/#/g' file

Et pour le décommenter:

sed -i '/<pattern>/s/^#//g' file

Dans ton cas:

sed -i '/2001/s/^/#/g' file    (to comment out)
sed -i '/2001/s/^#//g' file    (to uncomment)

L'option "g" à la fin signifie un changement global. Si vous ne souhaitez modifier qu'une seule instance de modèle, ignorez simplement cela.

75
JNLK

Pour compléter @ la réponse utile d'Avinash Raj avec un plus générique , conforme POSIX solution.

  • Toggles commentant les lignes qui correspondent à une chaîne spécifiable qui doit se produire en tant que mot distinct n'importe où sur la ligne.
  • Le caractère de commentaire (chaîne) est également spécifiable .

Notez que la solution est basée sur awk, car une solution robuste portable avec sed est pratiquement impossible en raison des limitations des expressions régulières POSIX ' basique.

awk -v commentId='#' -v Word='2001' '
  $0 ~ "(^|[[:punct:][:space:]])" Word "($|[[:punct:][:space:]])" { 
    if (match($0, "^[[:space:]]*" commentId))
      $0 = substr($0, RSTART + RLENGTH)
    else
      $0 = commentId $0
  } 
  { print }
  ' file > tmpfile.$$ && mv tmpfile.$$ file
  • (^|[[:punct:][:space:]]) et ($|[[:punct:][:space:]]) sont les équivalents regex étendus POSIX du \< et \> Affirmations de limites de mots connues d'autres dialectes d'expression régulière.
  • Espace blanc après le caractère du commentaire est conservé, mais pas avant.
  • Lorsque vous ajoutez le caractère de commentaire à une ligne, il est ajouté directement, sans espace.
  • Ainsi, si vous basculez uniquement les commentaires avec la solution this, tous les espaces sont conservés.
  • POSIX awk n'offre pas de mise à jour sur place (pas plus que POSIX sed, d'ailleurs), donc la sortie est d'abord capturée dans un fichier temporaire et ce fichier remplace ensuite l'original en cas de succès.
6
mklement0

Pour mac, qui ne prend pas en charge les paramètres sed standard, cela supprimerait le hashtag

sed -i "" "/.*#.*d\/docker-php-ext-xdebug\.ini.*/s/^#//g" docker-compose.yml
0
max4ever

Exemple rapide de comment commenter et commenter une ligne dans un fichier.

Exemple de fichier:

umask 027
TMOUT=600

Permet maintenant de sauvegarder le fichier (juste pour rire) et de commenter et de commenter:

# backup file (because we should always do this)
cp /etc/bash.bashrc /etc/bash.bashrc.$(date '+%Y-%m-%d,%H:%M:%S')

# original: TMOUT=600   , result :# TMOUT=600
sed -i '/[^#]/ s/\(^TMOUT=600.*$\)/#\ \1/' /etc/bash.bashrc

# original # TMOUT=600   ,result :TMOUT=600
sed -i '/^#.*TMOUT=600.*$/s/^#\ //' /etc/bash.bashrc
0
Mike Q