Comment reconnaitre le caratère backslash [Résolu/Fermé]

Signaler
Messages postés
641
Date d'inscription
samedi 17 février 2007
Statut
Membre
Dernière intervention
26 juin 2020
-
Messages postés
18242
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
13 juin 2021
-
Bonjour, dans un fichier, je veux remplacer une chaine de caractères par une autre. dans un shell bash.

La commande
sed -i -e "s/chaine\_a\_remplacer/nouvelle\_chaine/g" fichier

fonctionne très bien, à partir du moment où on place un backslash devant les caractères spéciaux contenus dans la chaine à remplacer ainsi que dans la chaine de remplacement.

Par contre je n'arrive pas à écrire un shell qui me permettrait de remplacer le caractère \
Exemple: je veux remplacer la chaine suivante:

\"TOTO"\ par rien du tout !!!! je ne suis pas arrivé à faire ça dans un shell, est-ce que quelqu'un aurait une idée ?

Merci pour vos réponses.

6 réponses

Messages postés
18242
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
13 juin 2021
5 308
hello
$ cat fichier
\"TOTO"\
$ sed 's/\\"TOTO"\\/rien du tout/g' fichier
rien du tout
Messages postés
641
Date d'inscription
samedi 17 février 2007
Statut
Membre
Dernière intervention
26 juin 2020
63
Bonjour et merci pour ta réponse dubcek, d'abord je fais une petite rectification sur la chaine de caractères que je veux remplacer par rien (c'est à dire en fait supprimer cette chaine), ce n'est pas comme j'ai dit dans mon premier message la chaine \"TOTO"\ mais la chaine \"TOTO\"

De plus je précise bien que je veux faire ça dans un shell pas directement dans une console, j'ai essayé de mettre des backslash devant les backslash déjà existants mais ça ne marche pas.

Voici ce que j'ai fait dans mon shell:

sed -i -e 's/\\"TOTO\\"/g' fichier

A l'exécution il me met le message:
sed: -e expression n°1, caractère 19: commande `s' inachevée

Voilà, merci pour votre aide.
Messages postés
18242
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
13 juin 2021
5 308
il manqe un /
sed -i -e 's/\\"TOTO\\"//g' fichier
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 234
Salut,

$ var='la chaine \"TOTO"\ mais la chaine \"TOTO\"'

$ echo "${var}"
la chaine \"TOTO"\ mais la chaine \"TOTO\"

$ echo "${var}" | sed 's/\\"[^\]*\\"//'
la chaine \"TOTO"\ mais la chaine

Messages postés
641
Date d'inscription
samedi 17 février 2007
Statut
Membre
Dernière intervention
26 juin 2020
63
Bonsoir, merci pour ta réponse zipe31 mais mon problème n'est pas de faire un echo dans une console, mon problème est de remplacer dans un fichier nommé fichier la chaine de caractères \"TOTO\" par rien du tout. Supposons que dans mon fichier j'ai ceci:

azertyuiop\"TOTO\"qsdfghjklm


à la sortie dans mon nouveau fichier je veux avoir ceci:
azertyuiopqsdfghjklm

Je précise que je ne veux pas faire ça dans une console mais dans un shell programmé dans un .sh

Merci pour vos réponses.
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 234
$ cat plop 
azertyuiop\"TOTO\"qsdfghjklm

$ sed 's/\\"[^\]*\\"//' plop
azertyuiopqsdfghjklm
Messages postés
641
Date d'inscription
samedi 17 février 2007
Statut
Membre
Dernière intervention
26 juin 2020
63
Re-bonsoir, zipe31 ce que tu me dis fonctionne si je passe la commande dans une console mais ça ne marche pas dans un programme shell écrit dans un fichier de commandes .sh

De plus si dans mon fichier j'ai par exemple \"TITI"\ et plus loin \"TOTO\" il va me supprimer \"TITI"\ parce que c'est le premier qu'il trouve. Mais moi ce que je veux c'est que dans mon fichier quand il rencontre la chaine \"TOTO\" je veux qu'il la supprime et qu'il ne supprime pas \"TITI"\

J'nsiste sur le fait qu'il ne s'agit pas pour moi de faire des echo sur une console mais dans un fichier donné supprimer la chaine de caractères \"TOTO\" par lancement d'un fichier de commandes shell.
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 234
Le contenu du fichier plop :
$ cat plop 
azertyuiop\"TOTO\"qsdfghjklm

De plus si dans mon fichier j'ai par exemple \"TITI"\ et plus loin \"TOTO\"
il va me supprimer \"TITI"\ parce que c'est le premier qu'il trouve.
Mais moi ce que je veux c'est que dans mon fichier quand il rencontre
la chaine \"TOTO\" je veux qu'il la supprime et qu'il ne supprime pas \"TITI"\


Le résultat de la commande sed sur le fichier plop dans un terminal :
$ sed 's/\\"TOTO\\"//' plop 
azertyuiopqsdfghjklm

De plus si dans mon fichier j'ai par exemple \"TITI"\ et plus loin
il va me supprimer \"TITI"\ parce que c'est le premier qu'il trouve.
Mais moi ce que je veux c'est que dans mon fichier quand il rencontre
la chaine je veux qu'il la supprime et qu'il ne supprime pas \"TITI"\


On crée un script bash :
$ cat foo.sh 
#!/bin/bash

sed -i.bak 's/\\"TOTO\\"//' $1

cat $1


On exécute le script :
$ ./foo.sh plop 
azertyuiopqsdfghjklm

De plus si dans mon fichier j'ai par exemple \"TITI"\ et plus loin
il va me supprimer \"TITI"\ parce que c'est le premier qu'il trouve.
Mais moi ce que je veux c'est que dans mon fichier quand il rencontre
la chaine je veux qu'il la supprime et qu'il ne supprime pas \"TITI"\


Le contenu du fichier plop après l'exécution du script :
$ cat plop
azertyuiopqsdfghjklm

De plus si dans mon fichier j'ai par exemple \"TITI"\ et plus loin
il va me supprimer \"TITI"\ parce que c'est le premier qu'il trouve.
Mais moi ce que je veux c'est que dans mon fichier quand il rencontre
la chaine je veux qu'il la supprime et qu'il ne supprime pas \"TITI"\


What else ? ;-))
Messages postés
641
Date d'inscription
samedi 17 février 2007
Statut
Membre
Dernière intervention
26 juin 2020
63
OK !! OK !! OK !! merci beaucoup nothing else ça marche mille excuses j'avais pas bien copié la commande. Encore merci.