Analysieren Sie eine Zeichenfolge im Bash-Skript

Ich habe andere Antworten überprüft, konnte jedoch keine korrekte Erklärung dazu erhalten.

I. habe eine String-Variable namens id, so dass id="{"name":"john"}". Wie kann ich 2 Variablen aus diesem String herausholen, wie-

key="name" value="john" 

Eine ausführliche Erklärung wäre wünschenswert, da ich das Parsen von Zeichenfolgen in Bash verstehen möchte.

Bisher habe ich die geschweiften Klammern aus dem String-

id="$( echo "${id}" | tr -d {} )" 

Ich kann " dort nicht als einschließen Es wird ein Fehler ausgegeben. Suchen Sie am Ende auch nach id.split(":"), um ein Array zu erhalten.

Kommentare

  • Können wir Sie vor dieser Taktik / Spur warnen, bevor es ‚ zu spät ist? Es scheint, als hätten Sie dort json oder andere strukturierte Daten, vielleicht wäre es ein dediziertes Tool Ein sicherer Weg, um Sie dahin zu bringen, wo Sie geht es weiter?
  • Ich habe gesehen, dass jq von anderen verwendet wird, aber es gibt keine Möglichkeit, dies ohne einen Dritten zu analysieren Tool?
  • Bringen Sie diese Daten aus einer Datei ein? Könnte es mehr als ein Paar Schlüssel / Werte geben? Wie würde ein doppeltes Anführungszeichen als Teil des Werts aussehen?
  • @kev: Technisch awk, sed , und grep sind ebenfalls Tools von Drittanbietern. Wenn Sie json -Daten verwenden, gibt es absolut keinen Grund, nicht über die richtigen Tools zu verfügen, um damit zu arbeiten.
  • Diese Daten sind das Ergebnis eines Befehls, den ich in meinem Skript ausgeführt. Es wird immer in diesem Format vorliegen – 1 Schlüssel und 1 Wert.

Antwort

Verwenden Sie jq:

id="{"name":"john"}" key=$(jq -r keys[] <<<"$id") value=$(jq -r .[] <<<"$id") 

-r: Mit dieser Option, wenn der Filter „s Das Ergebnis ist eine Zeichenfolge. Anschließend wird sie direkt in die Standardausgabe geschrieben und nicht als JSON-Zeichenfolge mit Anführungszeichen formatiert.

keys: Die integrierten Funktionstasten, wenn Wenn ein Objekt angegeben ist, werden seine Schlüssel in einem Array zurückgegeben.


Verwenden von json:

id="{"name":"john"}" key=$(json -ak <<<"$id") value=$(json -a "$key" <<<"$id") 

-a verarbeitet Eingaben als Array

-k gibt Schlüsselwerte zurück

Kommentare

  • Vielen Dank für die Erklärung. Funktioniert hervorragend. Ich denke, ‚ gibt es keine Möglichkeit, einen String ohne jq in Bash-Skripten.
  • @kev: Es gibt viele Möglichkeiten, Zeichenfolgen zu analysieren, aber ‚ ist unfair um dies als Zeichenfolge und nicht als JSON-Daten zu bezeichnen.
  • @kev JSON-Daten können codiert werden. Um es zu analysieren, müssten Sie es möglicherweise dekodieren. Außerdem kümmert sich JSON nicht um Leerzeichen (Zeilenumbrüche usw.) zwischen Schlüsseln und Werten, sodass Sie dies berücksichtigen müssten. Dies wurde bereits von den Autoren des zugrunde liegenden JSON-Parsers in jq für Sie durchgeführt.

Antwort

Sie haben buchstäblich nach understand string parsing in bash gefragt, also schreibe ich eine Antwort in diesem Sinne, obwohl es sich um die falsche Lösung für Ihr Problem . Sie können bash selbst verwenden, um das zu tun, was Sie möchten. wenn Sie wirklich sauber haben Daten ohne Sonderzeichen, wobei special als etwas außerhalb von [A-Za-z0-9 ] definiert ist:

$name":"john"}" $ # remove everything through the first "{" $ echo $id "name":"john"} $ # remove everything starting with the last "}" $ echo $id "name":"john" $ name="${id%:*}" # take everything before the ":" $ name="${name//\"/}" # remove quotes $ echo $name name $ value="${id#*:}" # take everything after the ":" $ value="${value//\"/}" # remove quotes $ echo $value john 

Dies alles wird unter „Parametererweiterung“ im Bash-Handbuch beschrieben. Beispiel: ${parameter#word}, das Remove matching prefix pattern verwendet, entfernt den Text word vom Anfang von $parameter. In ähnlicher Weise entfernt % das Suffix. // ersetzt alle Vorkommen eines Strings durch das, was danach kommt (im obigen Beispiel ${foo//\"/} Anführungszeichen (die also maskiert werden müssen) erscheinen als \") werden durch die leere Zeichenfolge ersetzt). Sie müssen jedoch jede Ersetzung für sich selbst durchführen: Sie können den Anfang und der Zeichenfolge nicht mit einem Befehl entfernen.

Sie haben wahrscheinlich auch bemerkt, dass Sie Sonderzeichen wie }, { und " müssen maskiert werden. Solange Sie daran denken, dies richtig zu machen, können Sie Code ziemlich einfach schreiben , aber so einfach es auch ist, es tendiert dazu, nur Schreibcode zu sein. Wenn Sie darauf zurückkommen Code in ein oder zwei Jahren, um ihn wiederzuverwenden, sehen Sie sich etwas wie #*\{} an und denken Sie sich, WTF bedeutet das überhaupt? und Kopieren Sie es dann einfach blind in ein neues Projekt, und Ihr Code wird auf subtile Weise unterbrochen, da er auf Sonderzeichen stößt, die Sie nicht erwartet hatten.

Die obigen Beispiele werden unterbrochen, wenn Ihre Name-Wert-Paare Sonderzeichen enthalten, z. B. geschweifte Klammern oder Anführungszeichen oder Doppelpunkte oder wahrscheinlich andere Zeichen. Dies funktioniert also gut für schnelles und schmutziges Scraping oder den 80% -Anwendungsfall, aber Sie sollten es wirklich nicht in der Produktion verwenden oder zu jeder Zeit, wenn Sie sicherstellen müssen, dass es immer mit jeder Eingabe funktioniert.

Auch ohne die Anweisungen echo, die Ihnen zeigen, was passiert, können Sie sehen, dass dieser Code bereits länger ist als die Beispiele in der anderen Antwort, die zeigen, wie es geht richtig. Wenn Sie also kein Drittanbieter-Tool verwenden, „geben Sie sich mehr Code zum Schreiben, wodurch Sie sowohl zum Schreiben als auch zum Debuggen länger brauchen, und Sie erhalten auch eine Lösung, die weniger flexibel ist und die wird.“ Pause, wenn etwas Unerwartetes auftritt.

Kommentare

  • Dies war sehr informativ – kann ‚ nicht verstehen, warum Leute abstimmen würden

Antwort

Alternativ können Sie ein auf einem Pfad basierendes Unix verwenden Dienstprogramm jtc :

id="{"name":"john"}" bash $ key=$(jtc -w"[0]<>k" <<<"$id") bash $ echo $key "name" bash $ value=$(jtc -w"[0]" <<<"$id") bash $ echo $value "john" bash $ 

PS> Offenlegung: Ich bin der Schöpfer des jtc – Shell-CLI-Tools für JSON-Operationen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.