Ignorer les commentaires (#) à l'aide de sed, mais de maintenir les lignes intacte
J'ai un fichier de config que je veux modifier fondamentalement la décommenté les lignes, mais pas les lignes commentées. Je suis en utilisant sed
.
Par exemple, j'ai un fichier appelé file.txt:
test # test # test test
Je veux remplacer "test" avec "TEST", mais ne PAS toucher les lignes commentées. Sortie finale doit montrer:
TEST # test # test TEST
OriginalL'auteur drewrockshard | 2011-01-25
Vous devez vous connecter pour publier un commentaire.
De sortie
*Remarque: Si votre seule exigence pour un commentaire, c'est que le premier caractère non-blanc est un
#
, alors vous pouvez utiliser:De sortie
OriginalL'auteur SiegeX
Je ne suis pas un
sed
expert, mais la regexp pour correspondre à ces lignes seront look quelque chose comme ceci:^[^#].*test
^
- début de la ligne[^#]
- premier caractère, rien à l'exception de #.*
- un peu plus les personnages, undefinedtest
- la chaîne que vous êtes à la recherche pourOriginalL'auteur dty
À ignorer les commentaires qui commencent par un
#
lors d'une substitution, vous pouvez utiliser la commande suivante:Dans votre cas, il devient:
L'avantage de cette solution sur d'autres solutions, c'est qu'il fonctionnera aussi si il y a un commentaire plus tard une ligne, comme illustré dans l'exemple ci-dessous.
Puisque cette solution utilise le tampon de la sed, cette solution n'est pas possible si vous avez besoin d'utiliser le tampon pour quelque chose d'autre.
D'entrée
De sortie
Explication
h;
- Enregistrer dans le buffer de saisies/[^#]*//1;
- Supprimer tout ce qui est avant#
x;
- Swap avec tampons/#.*//;
- Supprimer le commentaires/test/TEST/g;
- Remplacer toutes les occurences detest
avecTEST
G;
- Ajouter un saut de ligne + tampon (le commentaire)s/(.*)\n/\1/
- Supprimer le dernier caractère de saut de ligneLa
-r
commutateur est requis pour l'utilisation de\1
.OriginalL'auteur user42723
awk:
OriginalL'auteur glenn jackman
si vous avez Ruby(1.9+)
OriginalL'auteur kurumi