web-dev-qa-db-fra.com

Comment ajouter une virgule à la fin de chaque ligne sauf la dernière ligne?

Je veux ajouter une virgule à la fin de chaque ligne de ce type de fichier sauf la dernière ligne:

Je l'ai maintenant:

{...}
{...}
{...}
{...}

Je veux ceci:

{...},
{...},
{...},
{...}

Comment puis-je le faire avec la ligne de commande? Est-ce possible avec la commande sed?

21
Joan Triay

Le script sed suivant a une expression d'adresse $! qui correspond aux lignes qui ne sont pas les dernières, et une action de substitution s/$/,/ qui ajoute une virgule à côté de la fin de la ligne.

sed '$!s/$/,/' file

(Le $ dans l'adresse fait référence au dernier ligne tandis que le $ dans l'expression régulière de la substitution fait référence au dernier position du caractère sur chaque ligne. Ils ne sont pas liés, bien que dans un certain sens similaires.)

Ceci imprime le contenu modifié de file sur la sortie standard; redirigez vers un autre fichier pour les enregistrer dans un fichier ou utilisez sed -i si votre sed le supporte. (Certaines variantes nécessitent un argument vide pour le -i option, notamment * BSD/OSX sed.)

Si votre tâche consiste à générer un JSON valide à partir de quelque chose qui ne l'est pas, je suis sceptique quant à cette approche. Les formats structurés doivent être manipulés avec des outils qui comprennent les formats structurés, pas des outils de base orientés ligne; mais si cela vous aide à transformer les données orientées ligne en JSON approprié, c'est probablement une utilisation valide.

... Après coup, vous souhaiterez peut-être également envelopper la sortie dans un ensemble de crochets. Ensuite, il s'agit en fait d'un JSON techniquement valide (en supposant que chaque ligne est un fragment JSON valide en soi).

sed '1s/^/[/;$!s/$/,/;$s/$/]/' file

Sur la première ligne (expression d'adresse 1) remplacer dans un crochet ouvrant au début de la ligne (s/^/[/). Sur les lignes qui ne sont pas les dernières, ajoutez une virgule de fin, comme ci-dessus. Sur la ligne qui est la dernière (expression d'adresse $) ajoutez un crochet de fermeture à la fin de la ligne (s/$/]/). Si vous préférez les nouvelles lignes aux points-virgules, c'est bien; de nombreux dialectes sed vous permettent également de le diviser en plusieurs -e arguments.

52
tripleee

Restez simple, utilisez simplement awk:

$ awk '{printf "%s%s",sep,$0; sep=",\n"} END{print ""}' file
{...},
{...},
{...},
{...}
3
Ed Morton