2 votes

Comment insérer un bloc de commentaires avec sed

Je programme en bash pour modifier une grande collection de fichiers construits en C et j'ai besoin de commenter des segments d'information (/* */).

La ligne se lit comme suit : *action.acroread : {APPMGR_acroread("blah.pdf");}

Je veux insérer une chaîne de commentaire "/* */" avant le {APPMGR... et la fermer à la fin de la ligne.

Actuellement, j'ai le code

    for i_file in $file_list[@]}; do
        sed -i '/^*action.acroread/ s|.*|/* & */|' $i_file
        ...

    done

qui insère un /* au début de la ligne et un */ à la fin de la ligne, en commentant la ligne entière. Cela empêche également l'ajout de plusieurs blocs de commentaires au cas où j'exécuterais le script plusieurs fois.

Ce que je dois faire, c'est ajouter /* devant {APPMGR_acroread("blah.pdf");} et */ à la fin de la ligne, de sorte que le résultat final devrait ressembler à ceci

*action.acroread: /* {APPMGR_acroread(“blah.pdf”);} */ 

Ce que j'ai jusqu'à présent est

sed -i ‘/^action.acroread/ s|.{APPMGR_acroread|/* & */|’ $i_file 

Le résultat est le suivant

*action.acroread:/*  {APPMGR_acroread */(“blah.pdf”);} 

En outre, en l'exécutant une deuxième fois, une deuxième paire de blocs de commentaires apparaît

*action.acroread:/* /*  {APPMGR_acroread */ */(“blah.pdf”);} 

Le blah.pdf est différent dans chaque fichier. (blah.pdf, blah2.pdf, blah3.pdf, etc.)

Comment puis-je modifier le code pour ne bloquer en commentaire que la seconde moitié de la ligne en plus d'empêcher les blocs de commentaires multiples lors de l'exécution du script plusieurs fois ? Merci.

0voto

Wiktor Stribiżew Points 100073

En * y . sont spéciales dans sed Les motifs POSIX regex. Vous devez les échapper. De plus, vous devez capturer ce que vous devez conserver et ce que vous devez envelopper de /*...*/ en groupes séparés.

Vous pouvez utiliser

sed -i '/^\(\*action\.acroread[^{]*\)\(.*\)/ s||\1/* \2 */|' "$i_file"

Véase el en ligne sed Démo :

s='line...
*action.acroread: {APPMGR_acroread("blah.pdf");}
another line...'
sed '/^\(\*action\.acroread[^{]*\)\(.*\)/ s||\1/* \2 */|' <<< "$s"
## => 
#    line...
#    *action.acroread: /* {APPMGR_acroread("blah.pdf");} */
#    another line...

Détails

  • /^\(\*action\.acroread[^{]*\)\(.*\)/ - trouve les lignes qui commencent par *action.acroread et saisit dans le groupe 1 le préfixe ( *action.acroread ) et ensuite zéro ou plus caractères autres que { puis capture le reste de la ligne dans le groupe 2.
  • s||\1/* \2 */| - remplace la correspondance trouvée par le groupe 1, /* Groupe 2, et */ .

0voto

potong Points 18653

Cela pourrait fonctionner pour vous (GNU sed) :

sed -E 's#^(\*action\.acroread: )(...)?(\{.*\})(...)?#\1/* \3 */#' file

Si une ligne commence *action.acroread: il peut y avoir ou non 3 caractères avant une ouverture { et 3 caractères suivant une fermeture } dans l'un ou l'autre cas, remplacez la ligne par la première et la troisième référence arrière, la troisième référence arrière étant entourée de /* y */ .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X