3 votes

"sed" pour ajouter un espace uniquement sous une certaine condition

Je dois ajouter un espace après le # à chaque occurrence, seulement si le # est au début de la ligne et après le # il y a au moins un caractère qui n'est pas l'espace. Par exemple, ce code :

echo "# ok" | sed "s|^#[^ ]|# |g"

Renvoie # ok comme prévu, mais ce code :

echo "#ok" | sed "s|^#[^ ]|# |g"

Renvoie # k et non # ok comme prévu.
Comment obtenir la sortie # ok ?

Éditer :

Voici le code qui résout mon problème, grâce à @FedonKadifeli :

echo -e "#ok\n# ok\n #ok\n#ok #ok\n##ok #ok"

Renvoie :

#ok
# ok
 #ok
#ok #ok
##ok #ok

Ce code :

echo -e "#ok\n# ok\n #ok\n#ok #ok\n##ok #ok" | sed -r 's|^#(#*)([^[:space:]#])|#\1 \2|g'

Renvoie :

# ok
# ok
 #ok
# ok #ok
## ok #ok

6voto

steeldriver Points 118154

Une approche assez directe consisterait à remplacer le premier "hash" par "hash espace" seulement dans les lignes commençant par "hash pas espace":

$ echo "#ok" | sed "/^#[^ ]/s|#|# |"
# ok

Dans les variantes regex qui le permettent, comme Perl, vous pourriez utiliser negative lookahead:

$ echo "#ok" | perl -pe 's/^#(?! )/# /'
# ok

5voto

FedKad Points 6174

Vous pouvez utiliser sed "référence arrière" de cette manière :

sed -r 's/^#([^ ])/# \1/'

-1voto

Mario Palumbo Points 243

Ce code résout mon problème, merci à @steeldriver et @FedonKadifeli :

echo -e "#ok\n#ok\n# ok\n# ok\n#ok\nnobegin #ok"

Renvoie :

#ok
#ok
# ok
# ok
#ok
nobegin #ok

Ce code :

echo -e "#ok\n#ok\n# ok\n# ok\n#ok\nnobegin #ok" | sed "\|^#[^[:space:]]|s|#|# |g"

Ou ce code plus logique :

echo -e "#ok\n#ok\n# ok\n# ok\n#ok\nnobegin #ok" | sed -r "s|^#([^[:space:]])|# \1|g"

Renvoie :

# ok
# ok
# ok
# ok
# ok
nobegin #ok

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X