Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/03/2015, à 12: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, à 12: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, à 12: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, à 13: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, à 13: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, à 13: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, à 14: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, à 14: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, à 15: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 :

shopt a écrit :


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. smile

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, à 15:25)

Hors ligne

#10 Le 18/03/2015, à 15: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, à 16:21

MicP

Re : Remplacement de caractère avec SED

Un Très Grand MERCI à toi.

Dernière modification par MicP (Le 18/03/2015, à 21:27)

Hors ligne