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 .

32voto

Hiro.Protagonist Punkte 611

Die einfachste Lösung in Bash:

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

Dies wird als Teilstring-Expansion bezeichnet (siehe Gnu Bash Handbuch und suchen Sie nach ${parameter:offset:length} ). In diesem Beispiel wird die Teilzeichenkette von s beginnend bei Position 1 und endend bei der vorletzten Position. Dies ist auf die Tatsache zurückzuführen, dass, wenn length ein negativer Wert ist, wird er als rückwärts laufender Offset vom Ende der parameter .

1 Stimmen

Negative Längen werden ab bash v4.2 unterstützt

31voto

Some programmer dude Punkte 377919

Sie können dies mit nur einem Aufruf von sed :

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

30voto

Dr.Kameleon Punkte 22074

Der kürzeste Weg zum Ziel - versuchen:

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

Es entfernt tatsächlich alle " s (doppelte Anführungszeichen) von opt (gibt es wirklich noch mehr Anführungszeichen außer am Anfang und am Ende? Es ist also eigentlich das Gleiche, nur viel knapper ;-))

7 Stimmen

Wenn Sie alle doppelten Anführungszeichen entfernen wollen, ist es noch besser, "${opt//\"/}" zu verwenden. Keine Pipe, keine Subshell... Und seien Sie vorsichtig, wenn Sie Leerzeichen in opt haben, können Sie diese verlieren. Setzen Sie Variablen immer in Anführungszeichen wie : echo "$opt"

0 Stimmen

Nun, die Variable liest im Grunde den Pfad von DocumentRoot aus der httpd-Konfigurationsdatei, so dass ich nicht denke, dass es einen Fall geben könnte, wo ein Anführungszeichen möglicherweise in der Zeichenfolge sein könnte. Und diese sed ist viel sauberer und effizienter.... Vielen Dank!

17voto

Jonathan Lin Punkte 18242

更新情報

Eine einfache und elegante Antwort von Entfernen von einfachen und doppelten Anführungszeichen in einer Zeichenkette nur mit bash / Standard-Linux-Befehlen :

BAR=$(eval echo $BAR) streift Zitate von BAR .

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

Auf der Grundlage der Antwort von hueybois habe ich nach vielen Versuchen und Irrtümern diese Funktion entwickelt:

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

Wenn Sie nicht wollen, dass etwas ausgedruckt wird, können Sie die Auswertungen über die Pipeline an /dev/null 2>&1 .

Verwendung:

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

5 Stimmen

Obwohl ich das Einfache und Elegante sehr mag, sollte man beachten, dass eval nicht nur doppelte Anführungszeichen ausführt, sondern tatsächlich als Codezeile ausgewertet wird. Daher kann diese Technik zu unerwarteten Ergebnissen führen, wenn BAR andere Sequenzen enthält, die von der Shell ersetzt werden können (z.B. BAR=\'abc\' oder BAR=ab\'c oder BAR=a\$b, oder BAR=a\$(ls *) )

15voto

user1751825 Punkte 3562

Ich weiß, dass dies eine sehr alte Frage ist, aber hier ist eine weitere sed-Variante, die vielleicht für jemanden nützlich ist. Im Gegensatz zu einigen der anderen ersetzt sie nur doppelte Anführungszeichen am Anfang oder Ende...

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

Wenn Sie mit einfachen oder doppelten Anführungszeichen übereinstimmen müssen, und nur Zeichenfolgen, die richtig in Anführungszeichen gesetzt sind. Sie können diese etwas komplexere Regex verwenden...

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

Dabei werden Rückverweise verwendet, um sicherzustellen, dass das Zitat am Ende das gleiche ist wie am Anfang.

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