2012-07-02 22 views
80

Haciendo algo de edición de flujo para cambiar el desagradable icono de Parallels. Está poco desarrollado e integrado en la propia aplicación en lugar de ser un archivo de imagen. Así que he localizado este comando sed que tiene una cierta buena reacción:Obteniendo "error de sed - secuencia de bytes ilegal" (en bash)

sudo sed -i.bak s/Parallels_Desktop_Overlay_128/Parallels_Desktop_Overlay_000/g /Applications/Parallels\ Desktop.app/Contents/MacOS/prl_client_app 

Devuelve sed: RE error: illegal byte sequence

¿Puede alguien explicar lo que esto significa? ¿Qué parte del comando es el problema?

+0

Los procedentes de Google: primero pruebe [esta respuesta] (http://stackoverflow.com/a/23523680/510036). Llego a este hilo más veces de las que me gustaría admitir. – Qix

Respuesta

132

Pruebe a establecer la variable de entorno LANG (LANG=C sed ...) o utilizar una de las herramientas de sed binarios mencionados aquí: binary sed replacement

Por qué el error?

Sin LANG=C sed supone que están codificados en cualquier codificación se especifica en LANG y el archivo (siendo binario) pueden contener bytes que no son caracteres válidos en LANG 'codificación s (de este modo se puede conseguir 'secuencia de bytes ilegal')

¿Por qué funciona LANG=C?

C pasa a tratar todos los caracteres ASCII como ellos y los caracteres no ASCII como literales.

+4

Si 'bash' es su caparazón, puede ingresar' export LANG = C' e intentar nuevamente. – user664833

+18

Genial, pero usar 'LC_ALL = C sed ...' es el enfoque más robusto: si 'LC_ALL' o' LC_CTYPE' están configurados (en algo que no sea 'C'), establecer' LANG' no tendrá efecto. ('LC_ALL' _overrides_ todas las categorías configuradas individualmente, si las hay, mientras que' LANG' solo tiene efecto para esas categorías _not_ establecidas explícitamente. – mklement0

+3

Para mí 'LANG = C' no funcionó pero' LC_ALL = C' hizo – mreferre

63

LANG=C solo no funcionó el truco para mí, pero agregando LC_CTYPE=C también lo resolvió.

+0

Lo mismo para mí en OSX 10.8. ¡Gracias! – offner

+11

Un valor _efectivo de 'LC_CTYPE = C' es suficiente para resolver el problema:' LC_CTYPE = C sed ... '. Sin embargo, eso no funcionará si 'LC_ALL' está configurado (en algo que no sea' C'), porque eso _ reemplaza_ todas las categorías 'LC_ *' individuales. Por lo tanto, el enfoque más robusto es usar 'LC_ALL = C sed ...'. – mklement0

16

me las arreglé para hacerlo ejecutando:

unset LANG 

antes del comando sed.

No estoy seguro de lo que he hecho o por qué funciona, pero lo hizo.

+0

Necesitaba hacer la corrección anterior al seguir este tutorial: http://projectpoppycock.com/angularjs-phonegap-and-angular-seed-lets-go/ – bulltorious

+0

Esto elimina el error, pero en realidad no resuelve nada para mí. –

+1

En cuanto a por qué funciona: Si su configuración local fue inicialmente _set_ con '[export] LANG = ...' (en lugar de establecer 'LC_ALL' o configurar' LC_ * 'categorías individualmente), entonces' 'LANG' hace que' Las categorías LC_ * 'vuelven a' "C" '; terminando con un valor 'LC_CTYPE' de' C' es lo que resuelve el problema. Por el contrario, si 'LC_ALL' o incluso' LC_CTYPE' específicamente se configuran en algo que no sea 'C', su enfoque no funcionará. – mklement0

12

Además de LANG=C y LC_CTYPE=C, tuve que hacer LC_ALL=C para hacer que esto funcione.

LC_ALL anula todas las categorías individuales LC_*. Por lo tanto, el enfoque más robusto es usar LC_ALL=C sed ... - no es necesario tratar también con las otras variables.

+0

explicarlo un poco más, por favor – rpax

+2

@rpax: en realidad, un valor efectivo de 'LC_CTYPE' de C es suficiente, por lo que usar 'LC_CTYPE = C sed ...' (directamente ante el comando ofensivo) es _normally_ suficiente, _unless_ 'LC_ALL' - which _overrides_ se han configurado todas las categorías individuales 'LC_ *' -. Por lo tanto, el enfoque más sólido es usar 'LC_ALL = C sed ...' - no es necesario tratar también con las otras variables. – mklement0

+0

Esta debería ser la respuesta aceptada. Espero que no te importe, edité el comentario de @mklement0 en la respuesta. – Qix

Cuestiones relacionadas