Wie kann ich ein Komma am Ende jeder Zeile, außer der letzten Zeile?
Ich möchten, fügen Sie ein Komma an das Ende jeder Zeile dieser Art von Datei außer der letzten Zeile:
Ich dies nun:
{...}
{...}
{...}
{...}
Möchte ich dieses:
{...},
{...},
{...},
{...}
Wie kann ich das mit der Kommandozeile? Ist es möglich mit dem sed-Befehl?
- Dadurch wird es nicht gültiges JSON.
- Sie könnten werden, indem Sie mit Ihrer JSON von foreach-Schleife, so dass es nicht möglich ist, ohne
preg_replace
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den folgenden
sed
Skript hat eine Adresse-Ausdruck$!
was mit Linien, die nicht die Letzte, und eine substituton Aktions/$/,/
die fügt ein Komma nächsten an das Ende der Zeile.(Die
$
Sie die Adresse bezieht sich auf den letzten Linie während der$
im regulären Ausdruck in der substitution bezieht sich auf den letzten Zeichenposition auf jeder Linie. Sie sind nicht verwandt, obwohl in gewissem Sinne ähnlich.)Dadurch wird der geänderte Inhalt
file
auf der standard-Ausgabe; redirect auf eine andere Datei, um Sie in einer Datei speichern, oder verwenden Siesed -i
wenn Ihrsed
unterstützt. (Einige Varianten erfordern ein leeres argument der-i
option, insbesondere *BSD /OSXsed
.)Wenn Ihre Aufgabe ist die Erstellung Gültiger JSON von etwas, das nicht ist, bin ich skeptisch gegenüber diesem Ansatz. Strukturierte Formate bearbeitet werden soll, z.B. mit tools, die verstehen, strukturierten Formaten, nicht-basic-line-tools, aber wenn dies hilft Ihnen, verwandeln zeilenorientierte Daten an der richtigen JSON, das ist wahrscheinlich eine gültige verwenden.
... Wie ein nachträglicher Einfall, vielleicht wollen Sie wickeln, wird die Ausgabe in eine Reihe von eckigen Klammern zu. Dann ist es eigentlich technisch gültiges JSON (vorausgesetzt, jede Zeile ist eine gültige JSON-fragment auf seiner eigenen).
In der ersten Zeile (Adresse Ausdruck
1
) ersetzen in einer öffnenden eckigen Klammer an Anfang der Zeile (s/^/[/
). Auf Linien, die sind nicht die letzten, fügen einem abschließenden Komma, wie oben. Auf der Linie, die ist das Letzte (Adresse Ausdruck$
) fügen Sie eine schließende eckige Klammer am Ende der Zeile (s/$/]/
). Wenn Sie es vorziehen Zeilenumbrüche, um Semikolons, das ist in Ordnung; vielesed
Dialekte können Sie auch aufgeteilt in mehrere-e
Argumente.sed -i '$!s/$/,/' file
sed -i.bak '$!s/$/,/' file
- und es funktioniert!!! Danke!!!./jl2json.sh sample.jsonl sample.json
. Kuck mal hier gist.github.com/mrsarm/24e8531ef8375c768e03d1c1aea67262Halten Sie es einfach, nur mit awk:
awk
kümmert sich nicht, wenn eine variable nicht definiert ist, wird es genauso behandelt wie leer. Also, wenn die erste Zeile verarbeitet wird, gibt es keine 'sep', so dass Sie am Ende nicht mit einer Zeile am Anfang mit nur ein Komma drauf ist (wie man erwarten könnte, von einem einfachen Lesen dieses Skripts.Können Sie so etwas wie dieses:
Diese ersetzen werden am Ende der Zeile mit einem", " und schreiben Sie es auf file_with_added_commas.txt
Weitere Informationen finden Sie unter: fügen Sie text am Ende jeder Zeile