web-dev-qa-db-fra.com

sed - Commentant une ligne correspondant à une chaîne spécifique ET qui n'a pas déjà été commentée

J'ai le fichier de test suivant

AAA
BBB
CCC

En utilisant le fichier sed suivant, je peux commenter la ligneBBB.

# sed -e '/BBB/s/^/#/g' -i file

Je voudrais commenter la ligne si elle n'a pas déjà un # au début.

# sed -e '/^#/! /BBB/s/^/#/g' file

sed: -e expression #1, char 7: unknown command: `/'

Des idées comment je peux réaliser ceci?

49

En supposant que vous n’ayez aucune ligne avec plusieurs #s, cela fonctionnerait:

sed -e '/BBB/ s/^#*/#/' -i file

Remarque: vous n’avez pas besoin de/g puisque vous effectuez au maximum une substitution par ligne.

70
aragaer

Je trouve cette solution pour fonctionner au mieux.

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\ \1/' file

Peu importe le nombre de "#" symboles, il n’en ajoutera jamais un autre. Si le modèle que vous recherchez n'inclut pas de "#", il sera ajouté au début de la ligne et un espace de fin sera ajouté.

Si vous ne voulez pas d'espace de fuite

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\1/' file

Une autre solution avec le caractère spécial & qui fait référence à la totalité de la portion correspondante de l'espace de modèle. C'est un peu plus simple et plus propre que de capturer et de référencer un groupe d'expressions rationnelles.

sed -i 's/^[^#]*BBB/#&/' file
2
agostonbarna