469 Stimmen

Shell-Skript - Entfernen des ersten und letzten Anführungszeichens (") aus einer Variablen

Unten sehen Sie den Ausschnitt eines Shell-Skripts aus einem größeren Skript. Es entfernt die Anführungszeichen aus der Zeichenkette, die in einer Variablen enthalten ist. Ich verwende dazu sed, aber ist das effizient? Wenn nicht, was ist dann der effizienteste Weg?

#!/bin/sh

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

0 Stimmen

Ich würde vorschlagen, dass Sie sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$opt" . Diese Syntax entfernt Qoutes nur, wenn es ein passendes Paar gibt.

0 Stimmen

@JohnSmith Ich muss auch automatisch Anführungszeichen in einem Shell-Skript entschlüsseln, aber ich muss das tun, egal ob sie übereinstimmen oder nicht, also werde ich den von Ihnen geposteten Ausdruck wahrscheinlich nicht verwenden.

0 Stimmen

Wenn Sie diese Frage gefunden haben und einfach alle Anführungszeichen entfernen wollen, lesen Sie diese Antwort: askubuntu.com/a/979964/103498 .

2voto

Gene Pavlovsky Punkte 1316

Meine 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
}

Die Funktion akzeptiert Variablennamen und setzt Anführungszeichen an deren Stelle. Sie entfernt nur ein übereinstimmendes Paar von führenden und nachgestellten Anführungszeichen. Sie prüft nicht, ob das abschließende Anführungszeichen escaped ist (vorangestellt durch \ die selbst nicht escaped ist).

Meiner Erfahrung nach sind Allzweck-String-Utility-Funktionen wie diese (ich habe eine ganze Bibliothek davon) am effizientesten, wenn sie die Strings direkt manipulieren, keinen Musterabgleich verwenden und insbesondere keine Sub-Shells erstellen oder externe Tools wie 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

1voto

DevilTour Punkte 39

Es gibt noch eine andere Möglichkeit, dies zu tun. Zum Beispiel:

echo ${opt:1:-1}

0 Stimmen

Diese Antwort hat bereits erteilt worden und die andere ist ausführlicher.

-2voto

James Bond Punkte 1393

Wenn Sie versuchen, Anführungszeichen zu entfernen, weil das Makefile sie beibehält, versuchen Sie dies:

$(subst $\",,$(YOUR_VARIABLE))

Aufgrund einer anderen Antwort: https://stackoverflow.com/a/10430975/10452175

0 Stimmen

$(subst ...) ist eine make Funktion. Der OP hat kein Makefile erwähnt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X