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 .

587voto

wieczorek1990 Punkte 5978

Verwenden Sie tr zu löschen " :

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

HINWEIS: Dies ist keine vollständige Antwort auf die Frage, da alle doppelten Anführungszeichen entfernt werden, nicht nur die führenden und die nachgestellten. Siehe andere Antworten unten.

32 Stimmen

Das ist nicht das, was der Auftraggeber wollte, da auch alle Anführungszeichen entfernt werden, nicht nur die führenden und die nachgestellten.

38 Stimmen

Obwohl ich nicht explizit auf den OP antworte, ist das für mich die Lösung, da nur doppelte Anführungszeichen am Anfang und Ende von "/pfad/dateiname" stehen. Es gibt keine eingebetteten doppelten Anführungszeichen. +1

15 Stimmen

Diese Lösung wird von vielen Menschen gewünscht. In vielen Fällen lassen sich die verwertbaren Daten mit Hilfe von Skripten leicht auf eine von Anführungszeichen umgebene Zeichenkette reduzieren.

411voto

huelbois Punkte 6492

Es gibt einen einfacheren und effizienteren Weg, indem man die native Funktion der Shell zum Entfernen von Präfixen/Suffixen verwendet:

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

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

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

Ein weiterer Vorteil ist, dass umschließende Anführungszeichen nur dann entfernt werden, wenn diese vorhanden sind.

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

Verwendung von sed:

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

(Verbesserte Version, wie von jfgagne angegeben, um das Echo loszuwerden)

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

Es ersetzt also ein führendes " mit nichts, und ein hinteres " auch mit nichts. In demselben Aufruf (es ist nicht nötig, eine andere sed. Verwendung von -e können Sie mehrere Textverarbeitungen durchführen).

17 Stimmen

Sie können die Pipe in der sed-Lösung loswerden mit sed -e 's/^"//' -e 's/"$//' <<< $opt .

1 Stimmen

Dies kann zu Fehlverhalten führen, wenn die Zeichenfolge nicht sowohl ein führendes als auch ein abschließendes Anführungszeichen enthält. Irgendwelche Vorschläge für den Umgang mit, dass anmutig?

0 Stimmen

Um nur übereinstimmende äußere Anführungszeichen zu behandeln, siehe die Antwort von @Joachim Pileborg

214voto

killjoy Punkte 2920

Wenn Sie jq verwenden und versuchen, die Anführungszeichen aus dem Ergebnis zu entfernen, werden die anderen Antworten funktionieren, aber es gibt einen besseren Weg. Durch die Verwendung der -r können Sie das Ergebnis ohne Anführungszeichen ausgeben.

$ echo '{"foo": "bar"}' | jq '.foo'
"bar"

$ echo '{"foo": "bar"}' | jq -r '.foo'
bar

1 Stimmen

Ich benutze jq aber bitte beachten Sie, dass es nicht funktioniert, wenn jq auch eine ASCII-Ausgabe mit -a (es ist ein Fehler auf der Seite von jq)

2 Stimmen

yq hat auch -r Option: yq -r '.foo' file.yml

0 Stimmen

echo '{"files":["http://demo.com/1.jpg","http//:demo.com/1.jpg"]}‌​' | jq .files | jq -r 'join(" ")' | xargs wget , -r ist sehr nützlich, wenn das Rohr mit anderen Werkzeugen verwendet wird.

98voto

user1587520 Punkte 2359

Es gibt einen einfachen Weg, indem man xargs :

> echo '"quoted"' | xargs
quoted

xargs verwendet echo als Standardbefehl, wenn kein Befehl angegeben wird, und entfernt Anführungszeichen aus der Eingabe, siehe z. B. aquí . Beachten Sie jedoch, dass dies nur funktioniert, wenn die Zeichenfolge keine zusätzlichen Anführungszeichen enthält. In diesem Fall schlägt es entweder fehl (ungerade Anzahl von Anführungszeichen) oder es werden alle Anführungszeichen entfernt.

0 Stimmen

echo '"quoted"' | xargs --> quoted

3 Stimmen

Das funktioniert, aber nur bei einer geraden Anzahl von Anführungszeichen in einer Zeichenkette. Bei einer ungeraden Anzahl wird ein Fehler erzeugt.

2 Stimmen

Die einfachste und eleganteste! Danke.

60voto

Jehong Ahn Punkte 1022

Wenn Sie von aws cli hierher gekommen sind --query versuchen Sie dies --output text .

2 Stimmen

Genau von aws cli --query. Danke!

8 Stimmen

Für Azure-Cli verwenden Sie --output tsv

3 Stimmen

Hahaha. Verdammt, das ist genau das, was ich wollte

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