Tengo un archivo en codificación UTF-8 con BOM y quiero eliminar la BOM. ¿Hay alguna herramienta de línea de comandos de Linux para eliminar la lista de materiales del archivo?
$ file test.xml
test.xml: XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
command-line
files
unicode
m13r
fuente
fuente
Respuestas:
Si no está seguro de si el archivo contiene una lista de materiales UTF-8, esto (suponiendo la implementación de GNU de
sed
) eliminará la lista de materiales si existe, o no hará cambios si no es así.También puede sobrescribir el archivo existente con la
-i
opción:fuente
en_US.UTF-8
configuración regional y funcionó. ¿Cuándo fallará?1s/
significa solo buscar en la primera línea; otras líneas no se ven afectadas. Los^
medios solo coinciden al comienzo de la (primera) línea.\xEF\xBB\xBF
es la lista de materiales UTF-8 (cadena hexadecimal escapada).//
significa reemplazar con nada. Podría haber agregado1
al final (for1s/^xEF\xBB\xBF//1
), lo que significaría que solo coincida con la primera aparición del patrón en la línea. Pero como la búsqueda está anclada^
, esto no hará ninguna diferencia. Si el archivo no tiene la lista de materiales al comienzo de la primera línea, el patrón no coincidirá y, por lo tanto, no se realiza ningún cambio.Una lista de materiales no tiene sentido en UTF-8. Por lo general, se agregan por error por software falso en sistemas operativos Microsoft.
dos2unix
lo eliminará y también se encargará de otras idiosincrasias de archivos de texto de Windows.fuente
dos2unix
?Es posible eliminar la lista de materiales de un archivo con el
tail
comando:fuente
tail
¿Está usando 1 indexación basada? WTF!tail -c -1
otail -c 1
(para lotail
que generalmente se usa) es el contenido que comienza con el último byte,tail -c +1
comenzando con el primer byte.tail -c 0
/tail -c +0
porque eso sería mucho menos intuitivo.(dd bs=1 count=3 of=/dev/null; cat) <input >output
. O con GNU(head -c3 >/dev/null; cat)
, incluso en UTF8 u otro entorno local que no sea de un solo byte; La cabeza de GNU hace 'char' = byte.Usando VIM
Abrir archivo en VIM:
Eliminar la codificación BOM:
Guardar y Salir:
fuente
<feff>
, pero:set nobomb
no lo modifica ni lo elimina.Puedes usar
para eliminar la marca de orden de bytes desde el comienzo del archivo, si tiene alguna, así como para convertir cualquier nueva línea CR LF a solo LF. El
LANG=C LC_ALL=C
le dice al shell que desea que el comando se ejecute en la configuración regional C predeterminada (también conocida como la configuración regional POSIX predeterminada), donde los tres bytes que forman la marca de orden de bytes se tratan como bytes. La-i
opción de sed significa en el lugar. Si lo usa-i.old
, sed guarda el archivo original comofilename.old
y el nuevo archivo (con las modificaciones, si corresponde) comofilename
.Personalmente me gusta tener esto como
~/bin/fix-ms
; por ejemplo, comoasí que si necesito aplicar esto para decir todos los archivos y encabezados de fuente C (¡mi código anterior de la era MS-DOS, por ejemplo!), simplemente ejecuto
o, si solo quiero ver dicho archivo, sin modificarlo, puedo ejecutar
y no ver lo feo
<U+FEFF>
en mi terminal UTF-8.fuente
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
?sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
no funciona; devuelve un código de salida, pero procesa todos los archivos enumerados en la lista de argumentos antes de salir.--
supuesto, antes de los nombres de archivo es importante: sin él, sed puede considerar opciones de archivo que comienzan con un guión. Los edité en mi respuesta; ¡Gracias por el recordatorio!Recientemente encontré esta pequeña herramienta de línea de comandos que agrega o elimina la lista de materiales en archivos codificados UTF-8 arbitrarios: UTF BOM Utils ( nuevo enlace en github)
Pequeño inconveniente, solo puede descargar el código fuente de C ++. Debe crear el archivo MAKE (con CMake , por ejemplo) y compilarlo usted mismo, no se proporcionan binarios en esta página.
fuente