Sed avec variable contenant des caractères spéciaux

Résolu/Fermé
Georges - Modifié par Georges le 22/06/2013 à 16:16
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 22 juin 2013 à 22:02
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 :


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:

3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
22 juin 2013 à 17:58
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

1
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
0
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.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.

:)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
22 juin 2013 à 22:02
Peux-tu juste m'indiquer à quoi correspond le \ devant le premier #
Tout simplement pour faire comprendre à sed qu'on change le délimiteur de motif par défaut par un autre.

et pourquoi il n'y a pas de \ devant le 2ème #
Parce que la syntaxe de sed ne l'exige pas.
0