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 .

14voto

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

echo $Linux
Output:
"amzn"

Die einfachsten Möglichkeiten, doppelte Anführungszeichen aus Variablen zu entfernen, sind

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

Linux=$(eval echo $Linux)

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

Linux=`echo $Linux | xargs`

Alle liefert die Ausgabe ohne doppelte Anführungszeichen:

echo $Linux

amzn

13voto

nimig18 Punkte 637

Dies ist der diskreteste Weg, ohne sed zu verwenden:

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

Oder

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

Ausgabe:

   quotes: "fish"
no quotes:  fish

Ich habe das von eine Quelle .

1 Stimmen

Dadurch werden sowohl die Anführungszeichen innerhalb der Zeichenkette als auch die Anführungszeichen um die Zeichenkette herum entfernt.

1 Stimmen

Abgesehen vom Kommentar ist dies identisch mit @StevenPenny's Antwort von 2012 .

0 Stimmen

Beachten Sie, dass dies eine bash-spezifische Variablensubstitution verwendet und nicht in sh . Das heißt, ich denke, dass bei der Verwendung von bash dies die beste Antwort ist.

8voto

Maxxim Punkte 2069

In Bash könnten Sie den folgenden Einzeiler verwenden:

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

Dies entfernt umschließende Anführungszeichen (sowohl einfache als auch doppelte) aus der Zeichenkette, die in var wobei die Anführungszeichen innerhalb der Zeichenkette intakt bleiben. Außerdem wird dies nichts tun, wenn es nur ein einzelnes führendes Anführungszeichen oder nur ein einzelnes nachgestelltes Anführungszeichen gibt oder wenn es gemischte Anführungszeichen am Anfang/Ende gibt.


In einer Funktion verpackt:

#!/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}"

0 Stimmen

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

1 Stimmen

@user1751825: Die Frage des Auftraggebers lautete Anführungszeichen aus einer Zeichenkette entfernen, die von einer Variablen gehalten wird Sie müssten also Ihren Einzeiler ändern in temp=$(echo "$opt" | sed -E "s|^(['\"])(.*)\1$|\2|g") um dieses Ergebnis zu erreichen (vergessen Sie auch nicht, zu zitieren $opt ). Sie müssten also eine Subshell + Pipe zu sed verwenden. Da der OP auch nach einer effizient Lösung ist Ihr Einzeiler in keiner Weise einfacher oder besser als meine reine Bash-Lösung.

4voto

DEV Tiago França Punkte 498
STR='"0.0.0"' ## OR STR="\"0.0.0\""
echo "${STR//\"/}"
## Output: 0.0.0

0 Stimmen

Bitte fügen Sie Ihrer Antwort einige Details und Hintergrundinformationen für zukünftige Leser hinzu.

2voto

Federico Firenze Punkte 140

Ich verwende diesen regulären Ausdruck, der es vermeidet, Anführungszeichen aus Zeichenketten zu entfernen, die nicht ordnungsgemäß in Anführungszeichen gesetzt sind. Hier werden die verschiedenen Ausgaben in Abhängigkeit von den Eingaben gezeigt, nur eine mit Anfang-Ende-Anführungszeichen war betroffen:

echo '"only first' | sed 's/^"\(.*\)"$/\1/'

Ausgabe: >"nur zuerst<

echo 'only last"' | sed 's/^"\(.*\)"$/\1/'

Leistung: >"nur letzte"<

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

Leistung: >beide<

echo '"space after" ' | sed 's/^"\(.*\)"$/\1/'

Leistung: >"Leerzeichen nach" <

echo ' "space before"' | sed 's/^"\(.*\)"$/\1/'

Ausgabe: > "Leerzeichen vor"<

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