Vous trouverez ci-dessous l'extrait d'un script shell à partir d'un script plus grand. Il supprime les guillemets de la chaîne qui est détenue par une variable. Je le fais en utilisant sed, mais est-ce efficace? Sinon, quel est le moyen efficace?
#!/bin/sh
opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp
sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$opt"
. Cette syntaxe supprimera qoutes uniquement lorsqu'il existe une paire correspondante.Réponses:
Il existe un moyen plus simple et plus efficace d'utiliser la fonction de suppression native du préfixe / suffixe du shell:
${opt%\"}
supprimera le suffixe"
(échappé avec une barre oblique inverse pour empêcher l'interprétation du shell).${temp#\"}
supprimera le préfixe"
(échappé avec une barre oblique inverse pour empêcher l'interprétation du shell).Un autre avantage est qu'il ne supprimera les guillemets environnants que s'il y a des guillemets environnants.
BTW, votre solution supprime toujours le premier et le dernier caractère, quels qu'ils soient (bien sûr, je suis sûr que vous connaissez vos données, mais il vaut toujours mieux être sûr de ce que vous supprimez).
Utilisation de sed:
(Version améliorée, comme indiqué par jfgagne, se débarrasser de l'écho)
Ainsi, il remplace un début
"
par rien et un suivi"
par rien aussi. Dans le même appel (il n'est pas nécessaire de diriger et de démarrer un autre sed. En utilisant,-e
vous pouvez avoir plusieurs traitements de texte).la source
sed -e 's/^"//' -e 's/"$//' <<< $opt
.sed
regex pourrait être utilisé, ou la substitution de variable pourrait êtrecase $opt in '"'*'"') ... do it ... ;; esac
sed 's/^"\|"$//g'
Utilisez tr pour supprimer
"
:Remarque : Cela supprime tous les guillemets doubles, pas seulement les premiers et les derniers.
la source
Cela supprimera tous les guillemets doubles.
la source
Don't remove this \" quote
.:-(
Il existe un moyen simple d'utiliser xargs :
xargs utilise echo comme commande par défaut si aucune commande n'est fournie et supprime les guillemets de l'entrée. Voir par exemple ici .
la source
echo '"quoted"' | xargs
->quoted
Vous pouvez le faire avec un seul appel à
sed
:la source
Le chemin le plus court - essayez:
Cela supprime en fait tous les
"
s (guillemets doubles) deopt
(y aura-t-il vraiment plus de guillemets doubles qu'au début et à la fin? Donc, c'est en fait la même chose, et beaucoup plus bref ;-))la source
Si vous utilisez jq et essayez de supprimer les guillemets du résultat, les autres réponses fonctionneront, mais il existe une meilleure façon. En utilisant l'
-r
option, vous pouvez afficher le résultat sans guillemets.la source
jq
mais veuillez noter que cela ne fonctionne pas si jq génère également une sortie ASCII avec-a
(c'est un bogue du côté de jq)yq
a également l'-r
option:yq -r '.foo' file.yml
Mettre à jour
Une réponse simple et élégante de suppression des guillemets simples et doubles dans une chaîne en utilisant uniquement les commandes bash / standard Linux :
BAR=$(eval echo $BAR)
dépouille les citations deBAR
.================================================== ===========
Sur la base de la réponse de hueybois, j'ai trouvé cette fonction après de nombreux essais et erreurs:
Si vous ne voulez rien imprimer, vous pouvez
/dev/null 2>&1
.Usage:
la source
La solution la plus simple dans Bash:
C'est ce qu'on appelle l'expansion de la sous-chaîne (voir Gnu Bash Manual et rechercher
${parameter:offset:length}
). Dans cet exemple, la sous-chaînes
commence à la position 1 et se termine à l'avant-dernière position. Cela est dû au fait que silength
est une valeur négative, elle est interprétée comme un décalage vers l'arrière à partir de la fin deparameter
.la source
C'est le moyen le plus discret sans utiliser sed:
Ou
Production:
Je l'ai obtenu d' une source .
la source
Il y a une autre façon de procéder. Comme:
la source
Ma version
La fonction accepte les noms de variable et supprime les guillemets en place. Il supprime uniquement une paire correspondante de guillemets de début et de fin. Il ne vérifie pas si le guillemet de fin est échappé (précédé de
\
laquelle n'est pas elle-même échappée).D'après mon expérience, les fonctions utilitaires de chaîne à usage général comme celle-ci (j'en ai une bibliothèque) sont plus efficaces lors de la manipulation directe des chaînes, sans utiliser de correspondance de modèle et surtout sans créer de sous-shells, ou appeler des outils externes tels que
sed
,awk
ougrep
.la source
Je sais que c'est une très vieille question, mais voici une autre variante sed, qui peut être utile à quelqu'un. Contrairement à certains autres, il ne remplace que les guillemets doubles au début ou à la fin ...
la source