Sed avec variable contenant des caractères spéciaux
Résolu
Georges
-
zipe31 Messages postés 34620 Date d'inscription Statut Contributeur Dernière intervention -
zipe31 Messages postés 34620 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
J'aimerais via la commande sed substituer des lignes en utilisant une variable contenant des caractères spéciaux, voici un exemple simple et concret :
Dans ce cas la variable contient des / exemple : /home/toto, et du coup la commande sed censée supprimer les lignes qui contiennent l'expression contenue dans la variable ne sont pas supprimés.
En réalité mon script ressemble à celui ci-dessous et cela ne marche pas car la variable $line contient des caractères spéciaux, sans caractère spéciaux cela fonctionne.
En temps normal il faudrait mettre des \ devant les caractères spéciaux mais dans ce cas ce n'est pas possible, quelqu'un aurait-il une solution ?
Merci d'avance.
J'aimerais via la commande sed substituer des lignes en utilisant une variable contenant des caractères spéciaux, voici un exemple simple et concret :
export VARIABLE='pwd' echo $VARIABLE >> test.txt sed -i '/"$VARIABLE"/d' test.txt
Dans ce cas la variable contient des / exemple : /home/toto, et du coup la commande sed censée supprimer les lignes qui contiennent l'expression contenue dans la variable ne sont pas supprimés.
En réalité mon script ressemble à celui ci-dessous et cela ne marche pas car la variable $line contient des caractères spéciaux, sans caractère spéciaux cela fonctionne.
find / -xdev -type d -o -print > 1.txt find / -xdev -type d -o -ls > 2.txt for line in $(cat 1.txt) do sed -i '/"$line"/d' 2.txt done
En temps normal il faudrait mettre des \ devant les caractères spéciaux mais dans ce cas ce n'est pas possible, quelqu'un aurait-il une solution ?
Merci d'avance.
3 réponses
-
Salut,
Il suffit de changer le caractère délimiteur par défaut (le slash) par un autre caractère ne se trouvant pas dans ta variable.sed -i "\#${line}#d" 2.txt
Attention aux quotes aussi. Pour interpréter les variables dans une expression, soit il faut entourer l'expression entière par des quotes doubles, soit il faut sortir de l'expression en cas de quotes simples.
sed -i "\#${line}#d" 2.txt sed -i '\#'"${line}"'#d' 2.txt
-
salut,
accessoirement, une boucle for ne lit pas des lignes, mais des mots (tels que définis par l'IFS).
le mieux, pour lire un fichier, c'est d'utiliser une boucle while comme ça :while read line do echo "do stuff with \"$line\"" done < fichier
-
Merci pour ta réponse zipe31, j'ai testé et ce que tu as indiqué fonctionne parfaitement. Peux-tu juste m'indiquer à quoi correspond le \ devant le premier # dans
sed -i "\#${line}#d" 2.txtet pourquoi il n'y a pas de \ devant le 2ème # ?
Merci également à qqchquicommenceparQ, j'ai modifié mon script en suivant ton conseil.
:)