2 votes

Bash - sed remplacement de texte

J'essaie de remplacer une ligne de texte dans un fichier de propriétés. Par exemple :

food.type=banana

Avec cette ligne de code, je peux remplacer entièrement la banane par une autre entrée saisie.

FOOD=apple
sed "s/food.type=.*/food.type=$FOOD/" 

Sortie :

food.type=apple

Toutefois, lorsque la ligne de texte précédente que j'essaie de remplacer comporte un caractère / je n'arrive pas à faire fonctionner le remplacement. Par exemple :

food.type=/yellow/banana

Toute aide est la bienvenue. Merci !

5voto

shellter Points 15304

Les barres obliques sont lues comme fermant les motifs de correspondance/substitution reg-ex,

Faites

sed "s@food.type=.*@food.type=$FOOD@" 

Certains seds exigent que vous échappiez la première occurrence d'un délimiteur non standard, c'est-à-dire

sed "s\@food.type=.*@food.type=$FOOD@" 

J'espère que cela vous aidera.

1voto

Gordon Davisson Points 22534

Une autre option consiste à continuer à utiliser / comme délimiteur de sed, et échappe les slashs dans la chaîne de remplacement. bash peut faire cela (bien que ce soit un peu cryptique) :

sed "s/food.type=.*/food.type=${FOOD//\//\/}/"

Cette substitution de variable est plutôt énigmatique, alors laissez-moi la décomposer et l'expliquer morceau par morceau :

${FOOD Lancer une substitution variable de FOOD
// en remplaçant toutes les occurrences de
\/ le caractère / (notez qu'il doit être échappé dans ce contexte)
/ avec...
\/ la chaîne de remplacement \/ (notez que l'échappement ici est simplement traité comme une partie de la chaîne de remplacement)
} fin de la substitution

Mais ce n'est pas tout à fait parfait, car il existe plusieurs autres caractères qui peuvent poser problème s'ils apparaissent dans la chaîne de remplacement. Pour être vraiment sûr, vous pouvez soit faire plusieurs remplacements dans bash (désordonné), soit confier le travail à sed :

ESCAPEDFOOD="$(printf "%s" "$FOOD" | sed 's/[\/&]/\\&/g')"
sed "s/food.type=.*/food.type=$ESCFOOD/"

Encore une fois, la substitution devient un peu cryptique, alors voici une ventilation :

s/ Remplacer le motif
[\/&] l'un des personnages \ , / ou &
/ avec...
\\& la chaîne de remplacement \ (échappé ici) suivi de la correspondance originale
/g ...globalement (c'est-à-dire remplacer toutes les occurrences)

(Et oui, je suis conscient de l'ironie d'utiliser sed pour préparer une chaîne de caractères à utiliser avec sed .)

Notez qu'il est possible que j'aie oublié certains caractères gênants ; si c'est le cas, ils peuvent être ajoutés à la liste de contrôle de l'utilisateur. [] expression.

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