¿Cómo se vería un awkguión (presumiblemente una sola línea) para eliminar una lista de materiales ?
Especificación:
- imprimir cada línea después de la primera ( NR > 1)
- para la primera línea: si comienza con #FE #FFo#FF #FE, elimínelos e imprima el resto
                    
                        unicode
                                awk
                                byte-order-mark
                                
                    
                    
                        Boldewyn
fuente
                
                
            fuente

awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' INFILE > OUTFILEy asegúrese de que INFILE y OUTFILE sean diferentes!perl -i.orig -pe 's/^\x{FFFE}//' badfile, podría confiar en sus envariables PERL_UNICODE y / o PERLIO para la codificación. PERL_UNICODE = SD funcionaría para UTF-8; para los demás, necesitarías PERLIO.awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1'Usando GNU
sed(en Linux o Cygwin):En FreeBSD:
Ventaja de usar GNU o FreeBSD
sed: el-iparámetro significa "en el lugar" y actualizará los archivos sin necesidad de redirecciones o trucos extraños.En Mac:
Esta
awksolución en otra respuesta funciona , pero elsedcomando anterior no funciona. Al menos en Mac (Sierra), laseddocumentación no menciona el soporte ala de escape hexadecimal\xef.Se puede lograr un truco similar con cualquier programa conectando a la
spongeherramienta desde moreutils :fuente
10.11.6, esto no funciona, pero la respuesta oficial stackoverflow.com/a/1068700/9636 funciona bien.No awk, pero más simple:
Para comprobar la lista de materiales:
Si BOM está presente, verá:
00000000 ef bb bf ...fuente
cat file1.utf8 file2.utf8 file3.utf3 > allfiles.utf8se romperá. Nunca use una lista de materiales en UTF-8. Período.hdNo está disponible en OS X (a partir de 10.8.2), por lo que para comprobar si hay una BOM UTF-8 no se puede utilizar el siguiente:head -c 3 file | od -t x1.Además de convertir los finales de línea CRLF a LF,
dos2unixtambién elimina las listas de materiales:dos2unixtambién convierte archivos UTF-16 con una BOM (pero no archivos UTF-16 sin una BOM) a UTF-8 sin una BOM:fuente
Sé que la pregunta estaba dirigida a Unix / Linux, pensé que valdría la pena mencionar una buena opción para los que tienen problemas con Unix (en Windows, con una interfaz de usuario).
Me encontré con el mismo problema en un proyecto de WordPress (BOM estaba causando problemas con el feed de rss y la validación de la página) y tuve que buscar en todos los archivos en un árbol de directorios bastante grande para encontrar el que estaba con BOM. Encontré una aplicación llamada Reemplazar Pioneer y en ella:
Batch Runner -> Buscar (para encontrar todos los archivos en las subcarpetas) -> Reemplazar plantilla -> Binario eliminar lista de materiales (hay una plantilla de búsqueda y reemplazo lista para esto).
No era la solución más elegante y requería instalar un programa, lo cual es una desventaja. Pero una vez que descubrí lo que estaba pasando a mi alrededor, funcionó a las mil maravillas (y encontré 3 archivos de aproximadamente 2300 que tenían BOM).
fuente