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 .

10voto

Linux=`cat /etc/os-release | grep "ID" | head -1 | awk -F= '{ print $2 }'`

echo $Linux
Output:
"amzn"

Les méthodes les plus simples pour supprimer les guillemets des variables sont les suivantes

Linux=`echo "$Linux" | tr -d '"'` 

Linux=$(eval echo $Linux)

Linux=`echo ${Linux//\"/}`

Linux=`echo $Linux | xargs`

Tout fournit la sortie sans les guillemets :

echo $Linux

amzn

9voto

user1751825 Points 1464

Je sais que c'est une très vieille question, mais voici une autre variante de sed, qui pourrait être utile à quelqu'un. Contrairement à d'autres, elle ne remplace les guillemets doubles qu'au début ou à la fin...

echo "$opt" | sed -r 's/^"|"$//g'

Si vous avez besoin de faire correspondre des guillemets simples ou doubles, et seulement des chaînes de caractères qui sont correctement citées. Vous pouvez utiliser cette regex légèrement plus complexe...

echo $opt | sed -E "s|^(['\"])(.*)\1$|\2|g"

Cette méthode utilise les rétro-références pour garantir que la citation à la fin est la même qu'au début.

5voto

Steven Penny Points 18523

Cela supprimera tous les guillemets.

echo "${opt//\"}"

5voto

Maxxim Points 3

En Bash, vous pouvez utiliser la phrase suivante :

[[ "${var}" == \"*\" || "${var}" == \'*\' ]] && var="${var:1:-1}"

Cela supprimera les guillemets (simples et doubles) de la chaîne stockée dans le fichier var tout en gardant intacts les caractères de citation à l'intérieur de la chaîne. De plus, cela ne fera rien s'il n'y a qu'un seul guillemet avant ou qu'un seul guillemet arrière ou s'il y a des caractères guillemets mixtes au début et à la fin.


Enveloppé dans une fonction :

#!/usr/bin/env bash

# Strip surrounding quotes from string [$1: variable name]
function strip_quotes() {
    local -n var="$1"
    [[ "${var}" == \"*\" || "${var}" == \'*\' ]] && var="${var:1:-1}"
}

str="'hello world'"
echo "Before: ${str}"
strip_quotes str
echo "After: ${str}"

2voto

Gene Pavlovsky Points 755

Ma version

strip_quotes() {
    while [[ $# -gt 0 ]]; do
        local value=${!1}
        local len=${#value}
        [[ ${value:0:1} == \" && ${value:$len-1:1} == \" ]] && declare -g $1="${value:1:$len-2}"
        shift
    done
}

La fonction accepte le(s) nom(s) de variable(s) et supprime les guillemets à la place. Elle supprime uniquement une paire de guillemets ouvrants et fermants. Elle ne vérifie pas si le guillemet de fin est échappé (précédé de \ qui n'est pas lui-même échappé).

D'après mon expérience, les fonctions utilitaires de chaînes de caractères à usage général comme celle-ci (j'en ai une bibliothèque) sont plus efficaces lorsqu'elles manipulent directement les chaînes de caractères, sans utiliser de correspondance de motifs et surtout sans créer de sous-shells, ni appeler d'outils externes tels que sed , awk o grep .

var1="\"test \\ \" end \""
var2=test
var3=\"test
var4=test\"
echo before:
for i in var{1,2,3,4}; do
    echo $i="${!i}"
done
strip_quotes var{1,2,3,4}
echo
echo after:
for i in var{1,2,3,4}; do
    echo $i="${!i}"
done

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