web-dev-qa-db-fra.com

Remplacer les chaînes à l'aide de Sed And Regex

J'essaye de décommenter le contenu d'un fichier en utilisant sed mais avec regex (par exemple: [0-9] {1,5})

# one two 12
# three four 34
# five six 56

Ce qui suit fonctionne:

sed -e 's/# one two 12/one two 12/g' /file

Cependant, ce que je voudrais, c'est utiliser un motif d'expression régulière pour remplacer toutes les correspondances sans entrer de chiffres mais garder les chiffres dans le résultat.

19
tangi

Pour répondre à un exemple de question, simplement

sed 's/^# //' file

suffira, mais s'il est nécessaire de supprimer le commentaire uniquement sur certaines lignes contenant une expression rationnelle particulière, alors vous pouvez utiliser conditionnel adresse:

sed '/regex/s/^# //' file

Ainsi, toutes les lignes contenant regex seront sans commentaires (si la ligne commence avec un #)

... où regex pourrait être [0-9]$ comme:

sed '/[0-9]$/s/^# //' file

supprimera # au début des lignes contenant un nombre comme dernier caractère.

15
F. Hauri
sed -e 's/^#\s*\(.*[0-9].*\)$/\1/g' filename

devrait le faire.

7
Charles Engelke

Si vous ne voulez que les lignes non commentées qui contiennent des nombres, vous pouvez utiliser ceci:

sed -e 's/^#\s*\(.*[0-9]+.*\)/\1/g' file
0
Hari Menon

Est le -i option de remplacement dans le fichier respectif pas nécessaire? J'arrive à supprimer le premier # en utilisant ce qui suit:

sed -i "s/^# \(.*\)/\1/g" file

Afin de ne commenter que les lignes commentées qui se terminent par une séquence d'au moins un chiffre, je l'utiliserais comme ceci:

sed -i "s/^# \(.*[[:digit:]]\+$\)/\1/g" file

Cette solution nécessite que les lignes commentées commencent par un seul espace (juste derrière le #), mais cela devrait être facile à régler s'il n'est pas applicable.

0
J. Katzwinkel

La commande sed suivante décommentera les lignes contenant des nombres:

sed 's/^#\s*\(.*[0-9]\+.*$\)/\1/g' file
0
dogbane