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?
"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.\"
Est-ce donc la bonne façon d'échapper aux guillemets dans la commande sed?"
. Mais votre commande shell utilise une chaîne entre guillemets doubles et\"
est correcte à cet endroit. Lesed
programme voits/"text"/'text'/ig
comme l'argument de-e
.s/\"text\" /'text'/ig
Ne trouverait-elle"text"
qu'avec l'espace après?sed
c'est le bon outil pour le travail, peut-être que vous voulez un analyseur XML.Réponses:
Deux astuces:
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
./
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:
Compte tenu de mes deux conseils ci-dessus, la commande que vous pouvez utiliser pour supprimer les guillemets doubles et simples est la suivante:
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|["']||g
et passe cette chaîne à sed. Sur la base de mon deuxième conseil, sed traite cela de la même manière ques/['"]//g
. Ça veut direVous avez probablement besoin de quelque chose de plus complexe que cela pour faire ce que vous voulez, mais c'est un début.
la source
'foo'\''bar'
, nous pourrions utiliser'foo'"'"'bar'
.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:
la source