Pages : 1
#1 Le 18/03/2015, à 11:12
- Linuxman[13]
Remplacement de caractère avec SED
Bonjour je cherche à remplacer les espaces par des "_" dans une chaîne de caractère, mais SEULEMENT pour les chaînes entre guillemets.
La commande suivante applique ce changement pour chacun des espaces rencontrés :
sed -e 's/ /_/g'
Le but final est de pouvoir appliquer un : "cut -d' ' -fx-y, afin que cette commande ne considère par les espaces de la chaîne entre guillemets comme étant un séparateur de colonne.
Auriez-vous une idée ? Est-il possible de faire ça avec sed ?
Hors ligne
#2 Le 18/03/2015, à 11:21
- MicP
Re : Remplacement de caractère avec SED
Afin d'éviter tout malentendu, pourrais-tu nous transmettre deux exemples :
1/ chaîne source
2/ chaîne(s) résultante.
Merci.
Hors ligne
#3 Le 18/03/2015, à 11:24
- Linuxman[13]
Re : Remplacement de caractère avec SED
Yep !
"Salut à toi" me dit le gentilhomme vert !
Deviendrait après traitement : "Salut_à_toi" me dit le gentilhomme vert !
Hors ligne
#4 Le 18/03/2015, à 12:22
- MicP
Re : Remplacement de caractère avec SED
J'y suis arrivé comme ça, mais il y a sans doute une meilleure méthode.
# je mets ta chaîne d'exemple dans une variable
chIN="\"Salut à toi\" me dit le gentilhomme vert !"
# je créé une variable en extrayant de la chaîne d'exemple ce qui est entre guillemets
var_1=$(echo $chIN | sed -n 's/.*"\(.*\)\".*/\"\1\"/p')
# je créé une autre variable qui va contenir la chaîne de remplacement
var_2=$(echo $var_1 | sed 's/ /_/g')
# je remplace
echo $chIN | sed "s/${var_1}/${var_2}/"
Hors ligne
#5 Le 18/03/2015, à 12:36
- pingouinux
Re : Remplacement de caractère avec SED
Bonjour,
Avec awk
awk '{s="";for (i=1;i<=length($0);++i) { c=substr($0,i,1); c=="\x22" && guil=1-guil; guil && c==" " && c="_"; s=s c}print s}' <<<'"Salut à toi" me dit le gentilhomme vert !'
Hors ligne
#6 Le 18/03/2015, à 12:55
- nany
Re : Remplacement de caractère avec SED
Bonjour,
une autre proposition avec awk :
echo '"Salut à toi" me dit le gentilhomme vert !' | awk -F'"' '{OFS = "\""; gsub(/ /,"_",$2); print $0}'
Hors ligne
#7 Le 18/03/2015, à 13:47
- pingouinux
Re : Remplacement de caractère avec SED
S'il ne peut y avoir qu'une paire de " sur une même ligne, c'est la suggestion de nany en #6 qui me paraît la meilleure.
@MicP : Il manque en #4 quelques " autour des variables pour traiter correctement les espaces consécutifs.
Hors ligne
#8 Le 18/03/2015, à 13:52
- Linuxman[13]
Re : Remplacement de caractère avec SED
Merci pour toutes vos réponses. Je trouve la syntaxe de Awk trop ésotérique. C'est très lourd, mais c'est certainement très puissant.
Je l'ai appliqué à mon fichier et j'arrive à faire ce que je veux merci infiniment. Mais ça me chagrine parce que je ne comprends pas ce que je fais haha.
Hors ligne
#9 Le 18/03/2015, à 14:19
- MicP
Re : Remplacement de caractère avec SED
@ pingouinux : je cherche où, car chez moi (debian), ça fonctionne assez bien, mais c'est peut-être dû à ma configuration de bash :
…
complete_fullquote on
extquote on
…
Si tu as le temps de me donner un conseil à ce sujet (ou tout autre d'ailleurs), ou même simplement une piste, je prends avec très grand plaisir.
Merci beaucoup.
EDIT: Déjà, j'avais confondu # 4 (N° du post) avec la quatrième commande du script.
Dernière modification par MicP (Le 18/03/2015, à 14:25)
Hors ligne
#10 Le 18/03/2015, à 14:40
- pingouinux
Re : Remplacement de caractère avec SED
Voilà !
# je mets ta chaîne d'exemple dans une variable
chIN='"Salut à toi" me dit le gentilhomme vert ! "Bonjour à toi." répondit-t-il !'
echo "Texte initial"
echo "$chIN"
echo
echo "Version initiale"
# je créé une variable en extrayant de la chaîne d'exemple ce qui est entre guillemets
var_1=$(echo $chIN | sed -n 's/.*"\(.*\)\".*/\"\1\"/p')
# je créé une autre variable qui va contenir la chaîne de remplacement
var_2=$(echo $var_1 | sed 's/ /_/g')
# je remplace
echo $chIN | sed "s/${var_1}/${var_2}/"
echo
echo "Version corrigée"
# je créé une variable en extrayant de la chaîne d'exemple ce qui est entre guillemets
var_1=$(echo "$chIN" | sed -n 's/.*"\(.*\)\".*/\"\1\"/p')
# je créé une autre variable qui va contenir la chaîne de remplacement
var_2=$(echo "$var_1" | sed 's/ /_/g')
# je remplace
echo "$chIN" | sed "s/${var_1}/${var_2}/"
Et voici le résultat
Texte initial
"Salut à toi" me dit le gentilhomme vert ! "Bonjour à toi." répondit-t-il !
Version initiale
"Salut à toi" me dit le gentilhomme vert ! "Bonjour_à_toi." répondit-t-il !
Version corrigée
"Salut à toi" me dit le gentilhomme vert ! "Bonjour___à___toi." répondit-t-il !
Mais, dans un cas comme dans l'autre, seule la dernière paire de " est traitée.
Hors ligne
#11 Le 18/03/2015, à 15:21
- MicP
Re : Remplacement de caractère avec SED
Un Très Grand MERCI à toi.
Dernière modification par MicP (Le 18/03/2015, à 20:27)
Hors ligne