web-dev-qa-db-fra.com

Comment remplacer les guillemets dans un fichier avec SED?

J'ai un fichier contenant plusieurs lignes de XML. Je voudrais remplacer certaines parties du fichier. Certaines parties du fichier contiennent des guillemets (") que je voudrais remplacer. J'ai essayé de Escape la guillemaque avec \, mais je ne pense pas que cela fonctionne en fonction du résultat de mon dossier.

Voici un exemple d'une de mes commandes SED:

sed -e "s/\"text\"/'text'/ig" file.xml > temp.tmp

Est-ce la façon dont vous échappez à des guillemets dans une commande SED ou que je fais quelque chose de mal?

10
jbranchaud

Deux conseils:

  1. Vous ne pouvez pas échapper à une seule citation dans une chaîne indiquée avec des guillemets simples. Vous devez donc fermer la citation, ajouter une citation échappée, puis ouvrez les citations à nouveau. C'est-à-dire: 'foo'\''bar', qui se décompose comme suit:

    • 'foo' Cité foo
    • \' échappé '
    • 'bar' Cité bar

    céder foo'bar.

  2. (Facultatif) Vous n'avez pas nécessairement besoin d'utiliser / dans SED. Je trouve que l'utilisation de / et \ Dans la même expression SED rend difficile la lecture.

Par exemple, pour supprimer les guillemets de ce fichier:

$ cat /tmp/f
aaa"bbb"'ccc'aaa

Compte tenu de mes deux conseils ci-dessus, la commande que vous pouvez utiliser pour supprimer les guillemets doubles et simples est:

$ sed -e 's|["'\'']||g'  /tmp/f

Basé sur mon premier conseil, la coquille réduit le deuxième argument de SED (c'est-à-dire la chaîne après le -e) à s|["']||g et passe cette chaîne à sed. Basé sur ma deuxième pointe, SED traite cela comme s/['"]//g. Ça veut dire

supprimer tous les caractères correspondant à ' ou " (C'est-à-dire, remplacez-les sans rien)

Vous avez probablement besoin de quelque chose de plus complexe que cela pour faire ce que vous voulez, mais c'est un départ.

11
Yves Junqueira

J'ai un port Windows d'utilitaires UNIX afin que les commandes sont un peu différentes, mais j'avais un fichier CSV avec des guillemets de virgule et de devis. Utilisation de ce fil comme guide, j'ai pu supprimer les citations via cette commande:

c:\Temp> cat report.csv | sed "s/\,/\ /g" | sed "s/[""]//g"
0
JaimeR744