2 votes

Utiliser une variable avec sed

Tout d'abord, je m'excuse si cette question a déjà été traitée, mais je n'ai pas réussi à résoudre mon problème.

J'ai besoin de rechercher un modèle et de le remplacer par une ligne de texte comprenant à la fois du texte et une variable .

dites

$var = "stacko.ver/rulz=" **Note: $var contain double quotes & = & a dot and /**

Je veux donc le suivre 1. rechercher ;te.xt = Note : La valeur à rechercher contient ; & = et un point.

2. le remplacer par

textnum=$var

Bien sûr, $var doit être remplacé par sa valeur réelle.

Mes tentatives

sed -i "s/;te.xt =/textnum=$var/" file
sed -i "s/;te.xt =/textnum="$var"/" file
sed -i "s/";te.xt ="/"textnum=$var"/" file

Aucune d'entre elles ne fonctionne, soit sed me donne une erreur, soit la valeur de $var n'est pas affichée dans le fichier.

Merci pour votre aide

Salutations

5voto

that other guy Points 26297

Citer ne sert à rien puisque c'est un problème de sed, pas de bash. Choisissez simplement un délimiteur d'expression s sed qui n'apparaît pas dans votre texte :

sed -i "s|;te.xt =|textnum=$var|" file

Vous pouvez choisir n'importe quel délimiteur pour s qui n'apparaît pas dans votre saisie. sed -e 'streetlight' est une commande sed parfaitement valide.

2voto

glenn jackman Points 69748

Je peux voir l'erreur :

$ var="stacko.ver/rulz="
$ data="foo ;te.xt = bar"
$ sed "s/;te.xt =/textnum=$var/" <<< "$data"
sed: -e expression #1, char 31: unknown option to `s'

Le problème est que $var contient une barre oblique, donc la fonction s/// est en train de se briser. Vous devez choisir un caractère qui n'apparaît pas dans $var.

$ sed "s#;te.xt =#textnum=$var#" <<< "$data"
foo textnum=stacko.ver/rulz= bar

Cela peut être difficile -- que faire si slash et hash sont dans $var ? En utilisant bash, vous pouvez utiliser Cotation ANSI-C pour utiliser un caractère de contrôle qui a peu de chances d'apparaître dans vos données, par ex.

$ sed $'s\037;te.xt =\037textnum=$var\037' <<< "$data"
foo textnum=stacko.ver/rulz= bar

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