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 .

25voto

Joachim Pileborg Points 121221

Vous pouvez le faire avec un seul appel à sed :

$ echo "\"html\\test\\\"" | sed 's/^"\(.*\)"$/\1/'
html\test\

21voto

Hiro.Protagonist Points 511

La solution la plus simple en Bash :

$ s='"abc"'
$ echo $s
"abc"
$ echo "${s:1:-1}"
abc

Cette opération est appelée expansion de sous-chaîne (voir Manuel de Gnu Bash et chercher ${parameter:offset:length} ). Dans cet exemple, il prend la sous-chaîne de s en commençant par la position 1 et en terminant par l'avant-dernière position. Cela est dû au fait que si length est une valeur négative, elle est interprétée comme un décalage vers l'arrière à partir de la fin de l'enregistrement. parameter .

18voto

Jehong Ahn Points 134

Si vous venez ici pour les cliques d'aws --query essayez. --output text .

17voto

Jonathan Lin Points 2498

Mise à jour

Une réponse simple et élégante de Suppression des guillemets simples et doubles dans une chaîne de caractères en utilisant uniquement bash / les commandes Linux standard :

BAR=$(eval echo $BAR) bandes citées de BAR .

\=============================================================

Sur la base de la réponse de hueybois, j'ai créé cette fonction après de nombreux essais et erreurs :

function stripStartAndEndQuotes {
    cmd="temp=\${$1%\\\"}"
    eval echo $cmd
    temp="${temp#\"}"
    eval echo "$1=$temp"
}

Si vous ne voulez pas que quelque chose soit imprimé, vous pouvez envoyer les évaluations à /dev/null 2>&1 .

Utilisation :

$ BAR="FOO BAR"
$ echo BAR
"FOO BAR"
$ stripStartAndEndQuotes "BAR"
$ echo BAR
FOO BAR

12voto

nimig18 Points 329

C'est le moyen le plus discret sans utiliser sed :

x='"fish"'
printf "   quotes: %s\nno quotes:  %s\n" "$x" "${x//\"/}"

Ou

echo $x
echo ${x//\"/}

Sortie :

   quotes: "fish"
no quotes:  fish

J'ai trouvé ça dans une source .

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