Pour la suppression de caractères simple que vous faites dans ces commandes sed
, je recommanderais plutôt d'utiliser tr
, dont le but principal est de supprimer, compresser ou remplacer des caractères individuels, y compris les sauts de ligne (sed
est basé sur des regex, qui ont normalement besoin des sauts de ligne comme séparateurs de tampon, donc utiliser sed pour modifier les sauts de ligne est délicat). Je pense que cette commande tr
fait tout ce que vous cherchez à faire :
cat nom_fichier_json | tr -d "{}\" \012\011\015" | tr "," "\012"
La première commande tr
supprime toutes les accolades, les guillemets, les espaces, les retours chariot (octal 012, ascii 10), les tabulations (octal 011, ascii 9), et les sauts de ligne (octal 015, ascii 13). La deuxième commande tr
remplace toutes les virgules par des sauts de ligne. Tant que les noms de variables et les valeurs de votre fichier JSON ne contiennent pas de virgules, ces commandes vous permettraient d'éviter d'avoir besoin d'un parseur JSON dédié.
Cela dit, si vous avez un ensemble de commandes sed
qui fonctionnent indépendamment, les combiner pourrait être le plus facile à réaliser en utilisant l'option "-f" de sed
pour lire les commandes séparées depuis un fichier. Vous mettez simplement les chaînes s/.../.../g dans un fichier, chaque chaîne sur sa propre ligne, puis spécifiez ce nom de fichier après l'option "-f". Par exemple, si les trois commandes sed
que vous avez listées sont satisfaisantes, vous pourriez les mettre dans un fichier nommé "json.convert.sed" qui contient simplement ceci :
s/\"//g
s/\,/\n/g
s/\s//g
Ensuite, vous invoqueriez sed
avec ce fichier de commandes en utilisant :
sed -f json.convert.sed
Cela dit, ces commandes sed
ne fonctionnent pas pour moi pour accomplir ce que vous voulez, et je ne suis pas certain que vous puissiez jamais obtenir sed
pour modifier les sauts de ligne. C'est parce que sed
est basé sur l'ancien éditeur de lignes "ed", conçu pour éditer des lignes individuellement (une version scriptable), donc chaque ligne d'entrée est "analysée" en utilisant les sauts de ligne comme délimiteurs, puis la ligne (sans le saut de ligne) est passée au moteur d'édition, les commandes d'édition sont appliquées, puis la ligne éditée est renvoyée avec un saut de ligne. Ensuite, la boucle se répète. J'ai seulement pu utiliser sed
pour modifier un saut de ligne en changeant d'abord les sauts de ligne en un caractère distinct (qui n'apparaît pas autrement dans l'entrée) en utilisant tr
. Il n'y a pas d'intérêt à utiliser tr
de cette façon si tout ce que vous voulez faire est de supprimer des sauts de ligne, car tr
le fera pour vous. Mais si, par exemple, vous vouliez convertir des sauts de ligne en points-virgules avec un espace à la fin, une façon de le faire serait :
cat fichier_entree | tr "\012" "%" | sed "s/%/; /g"
(les sauts de ligne sont convertis en % par tr
, puis sed
convertit tous les caractères % en paires de caractères ";".)