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":