unix sed – (Terminal de Mac) sed para analizar JSON … ¿qué estoy haciendo mal?

Pregunta:

En Mac Terminal, estoy tratando de analizar el "nombre" de esta respuesta JSON:

{"created_at": "2012-08-27T20: 04: 27Z", "deleted_at": null, "id": 21462840, "item_type": "video", "name": "CastingBy-v12 mixed.mov", "private": true, "redirect_url": null, "remote_url": "http://f.cl.ly/items/3D0P02b3e3p2I/CastingBy-v12%20mixed.mov", "source": "Cloud / 1.5.4 CFNetwork / 520.4.3 Darwin / 11.4.0 (x86_64) (MacPro5% 2C1) "," updated_at ":" 2012-08-27T20: 13: 38Z "," view_counter ": 2," href ":" http: / /my.cl.ly/items/2840","icon":"http://my.cld.me/images/item-types/video.png","subscriptions":true,"url":"http : //files.housenyc.com/1I3E2F3C "," content_url ":" http://files.eeehousenyc.com/1I3Q0Z1E2F3C/CastingBy-v12%20mixed.mov "," download_url ":" http: //files.eeehousenyc .com / 1I3Q0F3C / download / CastingBy-v12% 20mixed.mov "," gauge_id ": null}

Estoy usando

sed 's/{.*?"name":"\(.+?\)".*/\1/'

pero devuelve toda la cadena.

Quiero que vuelva solo

CastingBy-v12 mixed.mov

Respuesta:

Analizar json con solo sed es tan problemático como analizar HTML; en resumen: dado que los elementos pueden incrustar otros elementos y la expresión regular no admite la recursividad, es esencialmente imposible analizar correctamente solo con expresiones regulares.

Hay una solución PCRE para analizar y validar json aquí: https://stackoverflow.com/questions/2583472/regex-to-validate-json : no lo he usado ni probado, así que tendré que aceptar la palabra del autor de que funciona … pero PCRE hace muchas cosas que simplemente no están en las expresiones regulares básicas o extendidas compatibles con sed.

En cualquier caso, en mi opinión, es mejor que use perl o python o awk y una de las librerías de análisis json para esos lenguajes, o una herramienta de análisis json especializada; aquí se mencionan varias:

https://stackoverflow.com/questions/3858671/unix-command-line-json-parser

Cualquiera de ellos se puede utilizar para extraer datos de la entrada JSON para su uso en un script de shell. O puede escribir todo su programa en ese idioma.

Por ejemplo, canalizar sus datos json en python -mjson.tool da como resultado esto:

$ echo "JSONDATAHERE" | python -m json.tool
{
    "content_url": "http://files.eeehousenyc.com/1I3Q0Z1E2F3C/CastingBy-v12%20mixed.mov", 
    "created_at": "2012-08-27T20:04:27Z", 
    "deleted_at": null, 
    "download_url": "http://files.eeehousenyc.com/1I3Q0F3C/download/CastingBy-v12%20mixed.mov", 
    "gauge_id": null, 
    "href": "http://my.cl.ly/items/2840", 
    "icon": "http://my.cld.me/images/item-types/video.png", 
    "id": 21462840, 
    "item_type": "video", 
    "name": "CastingBy-v12 mixed.mov", 
    "private": true, 
    "redirect_url": null, 
    "remote_url": "http://f.cl.ly/items/3D0P02b3e3p2I/CastingBy-v12%20mixed.mov", 
    "source": "Cloud/1.5.4 CFNetwork/520.4.3 Darwin/11.4.0 (x86_64) (MacPro5%2C1)", 
    "subscribed": true, 
    "updated_at": "2012-08-27T20:13:38Z", 
    "url": "http://files.housenyc.com/1I3E2F3C", 
    "view_counter": 2
}

que luego puede canalizar en sed de esta manera:

$ echo "JSONDATAHERE" | python -m json.tool | sed -n -e '/"name":/ s/^.*"\(.*\)".*/\1/p'
CastingBy-v12 mixed.mov

Basándose en la naturaleza codiciosa de las expresiones regulares, el script sed extrae todo entre el penúltimo " y el último " carácter en cualquier línea que contenga "name":

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım