Unten finden 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, aber ist es effizient? Wenn nicht, wie geht es dann effizient?
#!/bin/sh
opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp
sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$opt"
. Diese Syntax entfernt Qoutes nur, wenn ein übereinstimmendes Paar vorhanden ist.Antworten:
Es gibt eine einfachere und effizientere Möglichkeit, die native Funktion zum Entfernen von Shell-Präfixen / Suffixen zu verwenden:
${opt%\"}
entfernt das Suffix"
(mit einem Backslash versehen, um die Interpretation der Shell zu verhindern).${temp#\"}
entfernt das Präfix"
(mit einem Backslash versehen, um eine Shell-Interpretation zu verhindern).Ein weiterer Vorteil besteht darin, dass umgebende Anführungszeichen nur entfernt werden, wenn umgebende Anführungszeichen vorhanden sind.
Übrigens entfernt Ihre Lösung immer das erste und das letzte Zeichen, egal wie sie aussehen (natürlich bin ich sicher, dass Sie Ihre Daten kennen, aber es ist immer besser, sicher zu sein, was Sie entfernen).
Mit sed:
(Verbesserte Version, wie von jfgagne angezeigt, Echo loswerden)
Es ersetzt also eine Führung
"
durch nichts und eine Spur"
durch nichts. Im selben Aufruf (es ist nicht erforderlich, ein anderes Sed weiterzuleiten und zu starten. Mit können-e
Sie mehrere Textverarbeitungen durchführen).quelle
sed -e 's/^"//' -e 's/"$//' <<< $opt
.sed
case $opt in '"'*'"') ... do it ... ;; esac
sed 's/^"\|"$//g'
Verwenden Sie tr zum Löschen
"
:Hinweis : Dadurch werden alle doppelten Anführungszeichen entfernt, nicht nur führende und nachfolgende.
quelle
Dadurch werden alle doppelten Anführungszeichen entfernt.
quelle
Don't remove this \" quote
.:-(
Es gibt eine einfache Möglichkeit, xargs zu verwenden :
xargs verwendet echo als Standardbefehl, wenn kein Befehl angegeben ist, und entfernt Anführungszeichen von der Eingabe. Siehe zB hier .
quelle
echo '"quoted"' | xargs
->quoted
Sie können dies mit nur einem Anruf tun
sed
:quelle
Der kürzeste Weg - versuchen Sie:
Es werden tatsächlich alle
"
s (doppelte Anführungszeichen) entferntopt
(gibt es wirklich mehr doppelte Anführungszeichen als am Anfang und am Ende? Also ist es tatsächlich dasselbe und viel kürzer ;-))quelle
Wenn Sie jq verwenden und versuchen, die Anführungszeichen aus dem Ergebnis zu entfernen, funktionieren die anderen Antworten, aber es gibt einen besseren Weg. Mit der
-r
Option können Sie das Ergebnis ohne Anführungszeichen ausgeben.quelle
jq
aber bitte beachten Sie, dass es nicht funktioniert, wenn jq auch ASCII-Ausgabe mit ausgibt-a
(es ist ein Fehler an der Seite von jq)yq
hat auch-r
Option:yq -r '.foo' file.yml
Aktualisieren
Eine einfache und elegante Antwort aus dem Entfernen von einfachen und doppelten Anführungszeichen in einer Zeichenfolge nur mit bash / Standard-Linux-Befehlen :
BAR=$(eval echo $BAR)
Streifen Zitate ausBAR
.================================================== ===========
Basierend auf der Antwort von hueybois habe ich mir diese Funktion nach langem Ausprobieren ausgedacht:
Wenn Sie nicht möchten, dass etwas ausgedruckt wird, können Sie die Auswertungen an weiterleiten
/dev/null 2>&1
.Verwendung:
quelle
Die einfachste Lösung in Bash:
Dies wird als Teilzeichenfolgenerweiterung bezeichnet (siehe Gnu Bash-Handbuch und Suche nach
${parameter:offset:length}
). In diesem Beispiels
beginnt der Teilstring an Position 1 und endet an der vorletzten Position. Dies liegt an der Tatsache, dasslength
ein negativer Wert als rückwärts laufender Versatz vom Ende von interpretiert wirdparameter
.quelle
Dies ist der diskreteste Weg ohne sed:
Oder
Ausgabe:
Ich habe das von einer Quelle bekommen .
quelle
Es gibt noch einen anderen Weg. Mögen:
quelle
Meine Version
Die Funktion akzeptiert Variablennamen und entfernt Anführungszeichen. Es werden nur ein passendes Paar führender und nachfolgender Anführungszeichen entfernt. Es wird nicht überprüft, ob das nachfolgende Anführungszeichen maskiert ist (vorangestellt von
\
dem es nicht selbst maskiert ist).Nach meiner Erfahrung sind solche universellen Zeichenfolgen-Dienstprogrammfunktionen (ich habe eine Bibliothek davon) am effizientesten, wenn Sie die Zeichenfolgen direkt bearbeiten, keinen Mustervergleich verwenden und insbesondere keine Unterschalen erstellen oder externe Tools wie z
sed
,awk
odergrep
.quelle
Ich weiß, dass dies eine sehr alte Frage ist, aber hier ist eine andere sed-Variante, die für jemanden nützlich sein kann. Im Gegensatz zu einigen anderen ersetzt es nur doppelte Anführungszeichen am Anfang oder Ende ...
quelle