2017-08-24 1 views

Répondre

1

Quelque chose comme ceci:

$ sed "s/^[^#]/export &/g" 
export TRUST_STORE=/run/secret/truststore.jks 
#TRUST_STORE_PASSWORD=changeit 
export [email protected] 

Alternatives:

$ sed "/^[^#]/ s/^/export /g" 
$ sed "/^#/n; s/^/export /g" #n : read the next line 
+0

Notez la différence avec mon approche: elle ne correspond pas à une ligne vide. Je comprends l'exigence * Je ne veux pas le faire quand le premier caractère est "#" * car le premier caractère n'est pas "#" ou est suivi d'une fin de chaîne. –

1

Vous pouvez utiliser une expression régulière qui captera char autre que # ou à la fin de la ligne dans le groupe 1, puis restaurer la valeur capturée avec un \1 backreference

sed -r "s/^([^#]|$)/export \1/" 

L'option -r (également -E sur certains systèmes d'exploitation) active la syntaxe POSIX ERE dans sed.

  • ^ - allumettes début d'une ligne
  • ([^#]|$) - un groupe de capture n ° 1 correspondant à un produit de carbonisation autre que # (avec [^#]) ou (|) de fin de ligne ($).

Le \1 détient la valeur capturée avec le Groupe 1.

Voir la online demo.

1

Vous pouvez utiliser cette sed:

sed -i.bak '/^[[:blank:]]*#/!s/^/export /' file 

cat file 
export TRUST_STORE=/run/secret/truststore.jks 
#TRUST_STORE_PASSWORD=changeit 
export [email protected] 

ici:

  • /^[[:blank:]]*#/!: Pour ce faire que si nous avons # à la ligne suivante commencent en option
  • espaces blancs
  • s/^/export /: Remplacer ligne de départ avec export
+0

'/^[[: vide:]] * # /!': Ne faites cela que si ** DONT ** a '#' en début de ligne suivant les espaces blancs optionnels –

+0

Il est parfaitement valide de placer # après quelques espaces dans un ligne telle que les lignes en retrait pour le commenter. – anubhava

0

echo "abc" | perl -ne 's/^(?!#)/export /g; print;'

Aucune capture nécessaire.