8
votes

Comment supprimer \ n et \ r de la chaîne JSON à l'aide de Bash?

J'ai essayé de supprimer les nouveaux indicateurs de ligne et de retour chariot de ma sortie JSON en utilisant cette réponse .

J'ai également essayé d'exécuter ceci en me basant sur une autre réponse que j'ai vue sur Stack Overflow, mais cela ne semble toujours pas fonctionner:

getPage() {
curl --fail -X GET 'https://api.test.com/v1/marx?page=1&pageSize=1000&sort=desc' \
  -H 'Authorization: Bearer xxxxxxx' \
  -H 'cache-control: no-cache'  
}

getPage \
| jq -c '.data[]' \
  > text.json

Mon script .sh actuel ressemble à ceci:

 sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g' text.json > text_clean.json

Que me manque-t-il ici?

Si cela aide, un exemple de la chaîne qui le contient prend de nombreuses formes différentes dans la sortie, mais en voici une bonne:

Ok! Merci beaucoup. \ R \ nMeilleur, \ r \ nClaire \ r \ n \ r \ n


6 commentaires

@Emma J'ai essayé d'appliquer cette méthodologie et cela ne fonctionne toujours pas :(


@Emma Je vais lancer sed -i 's / \ r // g' text.json et ça ne fera vraiment rien


@gooponyagrinch Si vous avez installé perl , vous pourrez peut-être obtenir le résultat que vous attendez de echo "Ok! Merci beaucoup. \ r \ nMieux, \ r \ nClaire \ r \ n \ r \ n "| perl -pe 's / \ r \ n // g'


@gooponyagrinch Ou en utilisant tr : echo "Ok! Merci beaucoup. \ r \ nBest, \ r \ nClaire \ r \ n \ r \ n" | tr -d '\ r \ n'


Ce serait utile si nous pouvions réellement voir les entrées littérales. Si les nouvelles lignes que vous souhaitez supprimer ne sont pas littérales et se trouvent dans des chaînes JSON, je dirais à jq de faire la suppression.


@Jebby, tr fonctionne sur des caractères individuels, donc s'il analyse votre entrée pour supprimer une barre oblique inverse littérale (suivie d'un r ou n ou non ), il supprimera également un littéral n et un littéral r par eux-mêmes.


3 Réponses :


0
votes

Vous pouvez supprimer les caractères en utilisant perl si vous l'avez installé:

echo "Ok! Thank you so much.\r\nBest,\r\nClaire\r\n\r\n" | perl -pe 's/\r\n//g'


2 commentaires

perl est sans danger pour le travail. tr ne l'est pas.


@CharlesDuffy Merci pour le tuyau. J'ai supprimé l'exemple pour tr .



2
votes

Si vous souhaitez modifier JSON, faites-le dans jq. final

Dans ce cas, cela peut signifier changer:

getPage \
| jq -c '.data[] | sub("\r\n"; " ") | sub("\n"; " ")' \
> text.json


0 commentaires

1
votes

J'utiliserais tr pour cela.

Dans votre exemple, essayez ce qui suit:

 echo "Ok! Thank you so much.\r\nBest,\r\nClaire\r\n\r\n"| tr -d '\012\015'


2 commentaires

Cela suppose que ce sont des caractères de contrôle littéraux; mais si je comprends bien, l'OP traite en fait de la barre oblique inverse littérale suivie par le littéral r ou n pour représenter ces caractères dans JSON.


Je viens d'utiliser le même exemple qu'il utilise, mais quand même, même s'il est littéral ou non, il devrait toujours fonctionner en script bash.