Pregunta

¿Cómo sería un awk guión (presumiblemente una sola línea) para eliminar una lista de materiales parece?

Especificación:

  • impresión cada línea después de la primera (NR > 1)
  • para la primera línea: Si se inicia con #FE #FF o #FF #FE, eliminar los e imprimir el resto
¿Fue útil?

Solución

Prueba esto:

awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE

En el primer registro (línea), quite los caracteres de lista de materiales. Imprimir cada registro.

O un poco más corto, utilizando el conocimiento de que la acción predeterminada en AWK es imprimir el registro:

awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE

1 es la condición más corto que siempre se evalúa como verdadera, por lo que se imprime cada registro.

Disfrute!

- Adición -

Unicode Byte marca de orden (BOM) Preguntas incluye la siguiente tabla con la lista de materiales exacta bytes para cada codificación:

Bytes         |  Encoding Form
--------------------------------------
00 00 FE FF   |  UTF-32, big-endian
FF FE 00 00   |  UTF-32, little-endian
FE FF         |  UTF-16, big-endian
FF FE         |  UTF-16, little-endian
EF BB BF      |  UTF-8

Por lo tanto, se puede ver cómo \xef\xbb\xbf corresponde a EF BB BF UTF-8 BOM bytes de la tabla anterior.

Otros consejos

Uso de GNU sed (en Linux o Cygwin):

# Removing BOM from all text files in current directory:
sed -i '1 s/^\xef\xbb\xbf//' *.txt

En FreeBSD:

sed -i .bak '1 s/^\xef\xbb\xbf//' *.txt

La ventaja de usar GNU o FreeBSD -i: la awk parámetro significa "en su sitio", y actualizará los archivos sin necesidad de cambios de dirección o trucos extraños

.

En Mac:

Esta solución \xef en otra respuesta funciona, pero el comando sponge anterior no funciona. Al menos en Mac (Sierra) <=> documentación no menciona el apoyo a hexadecimal escapar ala <=>.

Un truco similar puede conseguirse con cualquier programa por medio de tuberías a la herramienta <=> de moreutils :

awk '…' INFILE | sponge INFILE

No awk, pero más simple:

tail -c +4 UTF8 > UTF8.nobom

Para comprobar la lista de materiales:

hd -n 3 UTF8

Si la lista de materiales está presente verá lo siguiente: 00000000 ef bb bf ...

Además de la conversión de los finales de línea CRLF a LF, dos2unix también elimina listas de materiales:

dos2unix *.txt

<=> también convierte UTF-16 los archivos con una lista de materiales (pero no UTF-16 los archivos sin un BOM) a UTF-8 sin una lista de materiales:

$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16be>bom-utf16be
$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16le>bom-utf16le
$ printf '\ufeffä\n'>bom-utf8
$ printf 'ä\n'|iconv -f utf-8 -t utf-16be>utf16be
$ printf 'ä\n'|iconv -f utf-8 -t utf-16le>utf16le
$ printf 'ä\n'>utf8
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be feff00e4000a
bom-utf16le fffee4000a00
   bom-utf8 efbbbfc3a40a
    utf16be 00e4000a
    utf16le e4000a00
       utf8 c3a40a
$ dos2unix -q *
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be c3a40a
bom-utf16le c3a40a
   bom-utf8 c3a40a
    utf16be 00e4000a
    utf16le e4000a00
       utf8 c3a40a

Sé que la pregunta iba dirigida a UNIX / Linux, pensaron que valdría la pena mencionar una buena opción para personas con impedimentos en UNIX (en las ventanas, con una interfaz de usuario).
Me encontré con el mismo problema en un proyecto de WordPress (BOM estaba causando problemas con la fuente RSS y validación de la página) y tuve que buscar en todos los archivos en un árbol de directorios muy grande para encontrar el que estaba con la lista de materiales. Encontrado una aplicación llamada Reemplazar Pioneer y en ella:

Corredor Lote -> Buscar (para encontrar todos los archivos de las subcarpetas) -> Reemplazar Plantilla -> Binario eliminar la lista de materiales (hay una lista de búsqueda hecha y reemplazar plantilla para esto).

No era la solución más elegante y que no requiere la instalación de un programa, lo cual es una desventaja. Pero una vez que me enteré de lo que estaba pasando a mi alrededor, funcionó como un encanto (3 y encontró archivos de los cerca de 2.300 que estaban con BOM).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top