Sed avec variable contenant des caractères spéciaux
Résolu
Georges
-
zipe31 Messages postés 38797 Statut Contributeur -
zipe31 Messages postés 38797 Statut Contributeur -
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.
A voir également:
- Sed avec variable contenant des caractères spéciaux
- Caractère spéciaux - Guide
- Caractères spéciaux - Guide
- Caractères spéciaux mac - Guide
- Caractères ascii - Guide
- Raccourcis clavier word caractères spéciaux pdf - Guide
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.
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.
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 :
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
Merci également à qqchquicommenceparQ, j'ai modifié mon script en suivant ton conseil.
:)
sed -i "\#${line}#d" 2.txt et pourquoi il n'y a pas de \ devant le 2ème # ?
Merci également à qqchquicommenceparQ, j'ai modifié mon script en suivant ton conseil.
:)