it-swarm.com.de

Shell-Skript - Entfernen Sie das erste und das letzte Anführungszeichen (") aus einer Variablen

Unten sehen Sie den Ausschnitt eines Shell-Skripts aus einem größeren Skript. Es entfernt die Anführungszeichen aus der Zeichenfolge, die von einer Variablen gehalten wird. Ich mache es mit sed, ist es effizient? Wenn nicht, wie geht das dann effizient?

#!/bin/sh

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

Es ist einfacher und effizienter, wenn Sie die native Shell-Funktion zum Entfernen von Präfixen/Suffixen verwenden:

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

$ {opt%\"} entfernt das Suffix" (mit einem Backslash versehen, um die Shell-Interpretation zu verhindern)

$ {temp #\"} entfernt das Präfix" (mit einem Backslash versehen, um die Shell-Interpretation zu verhindern)

Ein weiterer Vorteil ist, dass umgebende Anführungszeichen nur entfernt werden, wenn umgebende Anführungszeichen vorhanden sind.

Übrigens, Ihre Lösung entfernt immer das erste und das letzte Zeichen, unabhängig davon, um was es sich handelt (ich bin sicher, Sie kennen Ihre Daten, aber es ist immer besser, sicher zu sein, was Sie entfernen).

Sed verwenden:

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

(verbesserte Version, wie durch jfgagne angezeigt, das Echo loswerden)

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

Es ersetzt also das Führen "mit nichts" und das Schleppen "mit nichts. Im selben Aufruf (keine Pipe und kein Start einer anderen Sed, mit -e können Sie mehrere Textverarbeitungen durchführen).

205
huelbois

Benutze tr um zu löschen ":

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

HINWEIS: Dadurch werden alle doppelten Anführungszeichen entfernt, nicht nur führende und nachfolgende.

221
wieczorek1990

Dadurch werden alle doppelten Anführungszeichen entfernt.

echo "${opt//\"}"
30
Steven Penny

Es gibt einen direkten Weg mit xargs :

> echo '"quoted"' | xargs
quoted

xargs verwendet Echo als Standardbefehl, wenn kein Befehl bereitgestellt wird und Anführungszeichen aus der Eingabe entfernt werden, siehe z. hier

19
user1587520

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

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

Der kürzeste Weg - versuchen Sie:

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

Es entfernt tatsächlich alle "(doppelte Anführungszeichen) aus opt (wird es wirklich mehr doppelte Anführungszeichen als am Anfang und am Ende geben? Also ist es eigentlich dasselbe und viel kürzer; -))

15
Dr.Kameleon

Update

Einfache und elegante Antwort von https://stackoverflow.com/a/24358387/116174 :

BAR=$(eval echo $BAR) entfernt Anführungszeichen aus BAR.

=============================================== ===========

Basierend auf der Antwort von hueybois habe ich diese Funktion nach langem Ausprobieren gefunden:

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

Wenn Sie nicht möchten, dass etwas ausgedruckt wird, können Sie die Auswertung an /dev/null 2>&1 Weiterleiten.

Verwendungszweck:

$ BAR="FOO BAR"
$ echo BAR
"FOO BAR"
$ stripStartAndEndQuotes "BAR"
$ echo BAR
FOO BAR
8
Jonathan Lin

Ist das nicht der diskreteste Weg ohne sed?

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

OR

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

ausgabe:

   quotes: "fish"
no quotes:  fish

Ich habe dies von Quelle

6
nimig18

Einfachste Lösung:

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

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 entfernt Anführungszeichen. Es werden nur ein Paar führende und nachfolgende Anführungszeichen entfernt. Es wird nicht geprüft, ob das nachfolgende Anführungszeichen maskiert ist (vorangestellt von \ was selbst nicht entgangen ist).

Nach meiner Erfahrung sind solche allgemeinen String-Utility-Funktionen (ich habe eine Bibliothek von ihnen) am effizientesten, wenn Sie die Strings direkt manipulieren, keinen Pattern-Matching verwenden und insbesondere keine Sub-Shells erstellen oder externe Tools wie aufrufen sed, awk oder 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
1
Gene Pavlovsky