356 votes

Shell script - supprimer le premier et le dernier guillemet (") d'une variable

Voici l'extrait d'un script d'un script plus important. Il supprime les guillemets de la chaîne de caractères qui est maintenue par une variable. Je le fais en utilisant sed, mais est-ce efficace ? Si non, quelle est la méthode efficace ?

#!/bin/sh

opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp

0 votes

Je suggère d'utiliser sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$opt" . Cette syntaxe ne supprime les qoutes que lorsqu'il existe une paire correspondante.

0 votes

@JohnSmith Je dois également échapper automatiquement aux guillemets dans un shell script, mais je dois le faire qu'ils correspondent ou non, donc je n'utiliserai probablement pas l'expression que vous avez postée.

0 votes

Si vous avez trouvé cette question en voulant simplement supprimer toutes les citations, voyez cette réponse : askubuntu.com/a/979964/103498 .

428voto

wieczorek1990 Points 96

Utilisez tr pour supprimer " :

 echo "$opt" | tr -d '"'

REMARQUE : Cela ne répond pas entièrement à la question, car il faut supprimer tous les guillemets, pas seulement les guillemets initiaux et finaux. Voir les autres réponses ci-dessous.

25 votes

Ce n'est pas ce que le PO a demandé, car il supprime également tous les guillemets, et pas seulement ceux de début et de fin.

29 votes

Bien que ne répondant pas explicitement à l'OP, ceci me résout le problème car il n'y a que des guillemets doubles au début et à la fin de "/chemin/nom-fichier". Il n'y a pas de guillemets intégrés. +1

10 votes

Cette solution répondra aux attentes de beaucoup de gens. Dans de nombreux cas, les scripts peuvent facilement ramener les données exploitables à une chaîne de caractères entourée de guillemets.

373voto

huelbois Points 1993

Il existe une méthode plus simple et plus efficace, qui consiste à utiliser la fonction de suppression des préfixes/suffixes du shell natif :

temp="${opt%\"}"
temp="${temp#\"}"
echo "$temp"

${opt%\"} supprimera le suffixe " (échappé avec un backslash pour empêcher l'interprétation par l'interpréteur de commandes).

${temp#\"} supprimera le préfixe " (échappé avec un backslash pour empêcher l'interprétation par l'interpréteur de commandes).

Un autre avantage est qu'il ne supprimera les guillemets environnants que s'ils existent.

Par ailleurs, 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 est toujours préférable d'être sûr de ce que vous supprimez).

En utilisant sed :

echo "$opt" | sed -e 's/^"//' -e 's/"$//'

(Version améliorée, comme indiqué par jfgagne, en se débarrassant de l'écho)

sed -e 's/^"//' -e 's/"$//' <<<"$opt"

Il remplace donc un premier " avec rien, et une queue " avec rien non plus. Dans la même invocation (il n'y a pas besoin de pipe et de lancer un autre sed. En utilisant -e vous pouvez avoir plusieurs traitements de texte).

128voto

killjoy Points 884

Si vous utilisez jq et essayez de supprimer les guillemets du résultat, les autres réponses fonctionneront, mais il existe une meilleure méthode. En utilisant la fonction -r vous pouvez afficher le résultat sans guillemets.

$ echo '{"foo": "bar"}' | jq '.foo'
"bar"

$ echo '{"foo": "bar"}' | jq -r '.foo'
bar

1 votes

J'utilise jq mais veuillez noter que cela ne fonctionne pas si jq sort aussi une sortie ASCII avec -a (c'est un bug du côté de jq)

0 votes

yq a également -r option : yq -r '.foo' file.yml

60voto

user1587520 Points 481

Il existe un moyen simple d'utiliser xargs :

> echo '"quoted"' | xargs
quoted

xargs utilise echo comme commande par défaut si aucune commande n'est fournie et supprime les guillemets de l'entrée, voir e.g. aquí . Notez cependant que cela ne fonctionnera que si la chaîne ne contient pas de guillemets supplémentaires. Dans ce cas, soit elle échouera (nombre impair de guillemets), soit elle les supprimera tous.

0 votes

echo '"quoted"' | xargs --> quoted

3 votes

Cela fonctionne, mais uniquement pour un nombre pair de guillemets dans une chaîne. S'il y en a un nombre impair, elle génère une erreur.

1 votes

Le plus simple et le plus élégant ! Merci.

27voto

Dr.Kameleon Points 9295

Le chemin le plus court - essayez :

echo $opt | sed "s/\"//g"

Il supprime en fait toutes les " (guillemets doubles) de opt (y aura-t-il vraiment d'autres guillemets que ceux du début et de la fin ? C'est donc en fait la même chose, et beaucoup plus bref ;-))

6 votes

Si vous voulez supprimer tous les guillemets, il est encore mieux d'utiliser : "${opt//\"/}". Pas de pipe, pas de subshell... Et attention, si vous avez des espaces dans opt, vous risquez de les perdre. Il faut toujours citer les variables comme : echo "$opt".

0 votes

Eh bien, la variable lit essentiellement le chemin de DocumentRoot à partir du fichier de configuration de httpd, donc je ne pense pas qu'il puisse y avoir un cas où un caractère guillemet pourrait être présent dans la chaîne. Et ce sed est beaucoup plus propre et efficace.... Merci !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X