2011-12-19 12 views
37

¿Cómo elimino caracteres Unicode de un grupo de archivos de texto en el terminal? He intentado esto, pero no funcionó:Eliminar caracteres unicode de archivos de texto - sed, otros métodos bash/shell

sed 'g/\u'U+200E'//' -i *.txt 

necesito para eliminar estos unicodes a partir de los archivos de texto

U+0091 - sort of weird "control" space 
U+0092 - same sort of weird "control" space 
A0 - non-space break 
U+200E - left to right mark 
+0

Qué es la codificación de los archivos de texto en? – unwind

Respuesta

37

Si desea eliminar los caracteres particulares solamente y tiene pitón, se puede:

CHARS=$(python -c 'print u"\u0091\u0092\u00a0\u200E".encode("utf8")') 
sed 's/['"$CHARS"']//g' </tmp/utf8_input.txt> /tmp/ascii_output.txt 
+0

Quizás no sea el más bonito. Pero funcionó muy bien para mí. Al construir la variable CHARS, hizo que el sed sea más fácil de leer, y la variable CHARS se puede mantener fácilmente. La respuesta de Choroba también funciona, así que supongo que es una cuestión de gusto (y si tienes a mano Python). – Paulb

+1

Es un código alternativo de python parte'python -c 'print' '' .join (map (unichr, rango (0x80, 0xa0) + rango (0x2000, 0x200f))). Encode ("utf-8") ' ' –

+1

en los últimos linux os'es puede escribir caracteres Unicode presionando Ctrl + Shift + u seguido del código numérico y , por ejemplo 'Ctrl + Shift + u 0019 ⏎' – smoebody

12

Uso iconv:

iconv -f utf8 -t ascii//TRANSLIT </tmp/utf8_input.txt> /tmp/ascii_output.txt 

Esto se traducirá caracteres como "Š" en "S" (los que parecen más similares).

+1

no son ascii, quiero mantenerlos en utf8 pero quiero reemplazar estos espacios extraños en cadena nula normal '" "' – alvas

+0

Ver mi otra respuesta –

+0

No era lo que el OP quería, pero tenía la necesidad de convertir unicode Separador de línea (u2028) en una nueva línea. Hubiera preferido usar iconv, pero no pude encontrar la manera de hacerlo. ¿Hay alguna manera? –

49

claros caracteres de todo no-ascii de file.txt

$ iconv -c -f utf-8 -t ascii file.txt 
$ strings file.txt 
+0

Quiero mantener la codificación Unicode. lo siento, entonces iconv no es la solución. – alvas

+2

¿Por qué no puedes simplemente ejecutarlo en reversa? tempf = $ (mktemp) iconv -c -f UTF-8 ascii -t archivo.txt> $ tempf iconv -f -t ASCII UTF-8 $ tempf> archivo.txt –

+1

UTF-8 es un subconjunto del válida ASCII. La transformación inversa mantiene el archivo sin cambios. –

21

Para UTF-8 de Unicode, puede usar esta expresión regular para sed:

sed 's/\xc2\x91\|\xc2\x92\|\xc2\xa0\|\xe2\x80\x8e//' 
+2

¿cómo puedo encontrar la asignación de 'U + ...' a '\ xc2 \ ...'? – alvas

+18

'echo -ne '\ u0091' | xxd' – kev

+1

Esto podría ser un buen comienzo - http://www.utf8-chartable.de/ –

Cuestiones relacionadas