Comment remplacer les guillemets dans un fichier par sed?

10

J'ai un fichier qui contient 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é d' échapper au guillemet avec \, mais je ne pense pas que cela fonctionne en fonction du résultat de mon fichier.

Voici un exemple d'une de mes commandes sed:

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

Est-ce ainsi que vous échappez aux guillemets dans une commande sed ou est-ce que je fais quelque chose de mal?

jbranchaud
la source
2
Votre commande semble correcte pour être remplacée "text"par 'text'. Bien sûr, cela ne fera rien "othertext". Montrez quelques lignes d'entrée, la sortie indésirable correspondante et expliquez quelle sortie vous souhaitez à la place.
Gilles 'SO- arrête d'être méchant'
\"Est-ce donc la bonne façon d'échapper aux guillemets dans la commande sed?
jbranchaud
4
Pas pour sed: sed n'a pas besoin ni de soutien pour s'échapper ". Mais votre commande shell utilise une chaîne entre guillemets doubles et \"est correcte à cet endroit. Le sedprogramme voit s/"text"/'text'/igcomme l'argument de -e.
Gilles 'SO- arrête d'être méchant'
@Gilles Et les espaces? Sed comprend-il et respecte-t-il les espaces blancs? Par exemple, si ma commande contenait s/\"text\" /'text'/igNe trouverait-elle "text" qu'avec l'espace après?
jbranchaud
3
Les espaces doivent correspondre exactement. Plutôt que de poursuivre ce dialogue, je vous recommande de publier un exemple d'entrée et la sortie souhaitée correspondante (et peut-être d'expliquer pourquoi vous devez modifier le devis). Il n'est même pas clair que sedc'est le bon outil pour le travail, peut-être que vous voulez un analyseur XML.
Gilles 'SO- arrête d'être méchant'

Réponses:

11

Deux astuces:

  1. Vous ne pouvez pas échapper à un guillemet simple dans une chaîne entre guillemets simples. Vous devez donc fermer le devis, ajouter un devis échappé, puis rouvrir les devis. Soit '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 à utiliser /dans sed. Je trouve qu'en utilisant /et \dans la même expression sed, il est difficile à lire.

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 la suivante:

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

Sur la base de ma première astuce, le shell réduit le deuxième argument de sed (c'est-à-dire la chaîne après le -e) à s|["']||get passe cette chaîne à sed. Sur la base de mon deuxième conseil, sed traite cela de la même manière que s/['"]//g. Ça veut dire

supprimer tous les caractères correspondant à 'ou "   (c'est-à-dire les remplacer par rien)

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

Yves Junqueira
la source
1
Pour mettre un point plus fin sur votre deuxième astuce: vous pouvez utiliser n'importe quel caractère à la place de / lorsque vous utilisez les commandes s et y, éventuellement entre autres. Lors de l'utilisation de regexps avec d'autres commandes sed, le premier délimiteur (si vous utilisez une alternative à /) doit être échappé. Votre délimiteur préféré doit également être échappé si vous essayez de le faire correspondre dans l'expression rationnelle.
Eli Heady
Il est difficile de mélanger des guillemets simples et des guillemets doubles sans se salir. Certaines personnes trouvent plus facile à lire si vous citez des guillemets simples, en les mettant entre guillemets doubles, plutôt que de les échapper. Donc, plutôt que 'foo'\''bar', nous pourrions utiliser 'foo'"'"'bar'.
Scott
1

J'ai un port Windows d'utilitaires unix, donc les commandes sont un peu différentes mais j'avais un fichier csv avec des virgules et des guillemets. En utilisant ce fil comme guide, j'ai pu supprimer les guillemets via cette commande:

c:\Temp> cat report.csv | sed "s/\,/\ /g" | sed "s/[""]//g"
JaimeR744
la source
Merci! était coincé là-dessus!
sendbits