Queremos quitar ^[, y todas las secuencias de escape.

sed no está funcionando y que nos está dando este error:

$ sed 's/^[//g' oldfile > newfile; mv newfile oldfile;
sed: -e expression #1, char 7: unterminated `s' command

$ sed -i '' -e 's/^[//g' somefile
sed: -e expression #1, char 7: unterminated `s' command
  • Estás buscando a los dos personajes, el símbolo de intercalación ^ y abrir corchete [, o usted está buscando para uno de los personajes, de control-[ (ESCAPE ASCII, 0x1B)? Usted está buscando para quitar el terminal de control de secuencias que siguen el carácter ESC? Si es así, que es un trabajo complejo, y en última instancia requiere que usted sepa cuál es la terminal de los códigos de control fueron generados por diferentes tipos de terminales de uso de diferentes secuencias de control, y para un único tipo de terminal de comandos diferentes tienen diferentes números de caracteres siguientes.
  • Esto no es una tarea tan difícil – depende en parte del contexto.
InformationsquelleAutor hasan | 2011-06-30

11 Comentarios

  1. 43

    Estás buscando ansifilter?


    Dos cosas que usted puede hacer: entrar en el literal escape (en bash:)

    De usar el teclado de entrada:

    sed 's/Ctrl-vEsc//g'

    alternativamente

    sed 's/Ctrl-vCtrl-[//g'

    O puede utilizar el carácter de escape:

    sed 's/\x1b//g'

    o para todos los los caracteres de control:

    sed 's/[\x01-\x1F\x7F]//g' # NOTE: zaps TAB character too!
    • Lovin’ el teclado de la pantalla +1 !
    • ansifilter gran consejo! TVM
  2. 20

    commandlinefu da la respuesta correcta que tiras ANSI colores, así como los comandos de movimiento:

    sed "s,\x1B\[[0-9;]*[a-zA-Z],,g"
    • Esto funciona con gnu sed, pero no es portable a otras sed implementaciones (por ejemplo, bsd) – debido a la \x1B. Por otra sed, puede utilizar el raw carácter de escape (se puede utilizar la combinación de teclas ctrl-v prefijo para insertar un carácter de escape literales en la línea de comandos).
  3. 16

    He conseguido con el siguiente para mis propósitos, pero esto no incluye todas las posibles ANSI se escapa:

    sed -r s/\x1b\[[0-9;]*m?//g

    Esto elimina m comandos, pero para todos los escapes (como se ha comentado por @lethalman) uso:

    sed -r s/\x1b\[[^@-~]*[@-~]//g

    Véase también «Python regex para que coincida con VT100 secuencias de escape«.

    También hay un tabla de secuencias de escape comunes.

    • Que sólo escapa a la m comando. Esto debería ser más genérico \x1b\[[^@-~]*[@-~]
    • Me mencionó específicamente que no es genérico— «…pero esto no incluye todas las posibles ANSI se escapa…»
    • El [^@-~]*[@-~] no funciona para mí; yo necesitaba [^A-Za-z]*[A-Za-z] (que parece coincidir con todos los caracteres en la tabla)
    • Tenga en cuenta que en BSD (Mac OS X) sed no es compatible con ANSI-C secuencias de escape como \x1b. Así que en estos entornos se podría apoyarse en el shell un poco por tener que ampliar el escape byte: sed 's/'"$(printf '\x1b')"'\[[^@-~]*[@-~]//g' — Probado en ambos BSD y GNU sed en bash4, parece funcionar bien.
  4. 9

    ansi2txt comando (parte de kbtin paquete) parece estar haciendo el trabajo perfectamente en Ubuntu.

    • Así ansi2txt parece que no tira de caracteres en negrita, mientras que la respuesta usando col -b se enumeran a continuación (perversamente) no. Aquí es un caso de prueba para demostrar esto: diff <(man -Tutf8 tmux | col -b | head | hd) <(man -Tutf8 tmux | ansi2txt | head | hd)
    • esto es en el colorized-logs paquete
    • Parece que la tubería ansi2txt a col -b es necesario quitar todo.
  5. 7

    He tropezado con este post cuando buscando una forma de tira extra formato de las páginas man. ansifilter hice, pero estaba lejos de ser resultado deseado (por ejemplo todos los anteriormente caracteres en negrita se duplicaron, como SSYYNNOOPPSSIISS).

    Para esa tarea el comando correcto sería col -bx, por ejemplo:

    groff -man -Tascii fopen.3 | col -bx > fopen.3.txt

    (fuente)

    • Parece ser que el col -b opción que hace esto. La documentación dice que esto elimina backspaces caracteres :/, vaya usted a saber. Sin embargo, es la opción más compacta que he podido encontrar que no requieren de uno a instalar cosas (fuera de uno, el gestor de paquetes)
    • i++ para esto. No reinventar la rueda, de la gente. Véase también colcrt
  6. 4

    Puede quitar no todos los caracteres imprimibles con esto:

    sed 's/[^[:print:]]//g'

    • En Mac, el uso de sed, esta es la única respuesta que trabajó para quitar el \x1b ascii de los caracteres de escape.
  7. 2

    Sólo una nota, digamos que usted tiene un archivo como este (por ejemplo los finales de línea son generados por git remoto informes):

    echo -e "remote: * 27625a8 (HEAD, master) 1st git commit\x1b[K
    remote: \x1b[K
    remote: \x1b[K
    remote: \x1b[K
    remote: \x1b[K
    remote: \x1b[K
    remote: Current branch master is up to date.\x1b[K" > chartest.txt

    En binario, esto se parece a esto:

    $ cat chartest.txt | hexdump -C
    00000000  72 65 6d 6f 74 65 3a 20  2a 20 32 37 36 32 35 61  |remote: * 27625a|
    00000010  38 20 28 48 45 41 44 2c  20 6d 61 73 74 65 72 29  |8 (HEAD, master)|
    00000020  20 31 73 74 20 67 69 74  20 63 6f 6d 6d 69 74 1b  | 1st git commit.|
    00000030  5b 4b 0a 72 65 6d 6f 74  65 3a 20 1b 5b 4b 0a 72  |[K.remote: .[K.r|
    00000040  65 6d 6f 74 65 3a 20 1b  5b 4b 0a 72 65 6d 6f 74  |emote: .[K.remot|
    00000050  65 3a 20 1b 5b 4b 0a 72  65 6d 6f 74 65 3a 20 1b  |e: .[K.remote: .|
    00000060  5b 4b 0a 72 65 6d 6f 74  65 3a 20 1b 5b 4b 0a 72  |[K.remote: .[K.r|
    00000070  65 6d 6f 74 65 3a 20 43  75 72 72 65 6e 74 20 62  |emote: Current b|
    00000080  72 61 6e 63 68 20 6d 61  73 74 65 72 20 69 73 20  |ranch master is |
    00000090  75 70 20 74 6f 20 64 61  74 65 2e 1b 5b 4b 0a     |up to date..[K.|
    0000009f

    Es visible que git aquí añade la secuencia 0x1b 0x5b 0x4b antes de final de línea (0x0a).

    Tenga en cuenta que mientras que usted puede coincidir con el 0x1b con un formato literal \x1b en el sed, NO se puede hacer lo mismo para 0x5b, que representa a la izquierda corchete [:

    $ cat chartest.txt | sed 's/\x1b\x5b//g' | hexdump -C
    sed: -e expression #1, char 13: Invalid regular expression

    Podría pensar que usted puede escapar de la representación con una barra diagonal inversa adicional \, lo cual termina como \\x5b; pero mientras que «pasa» – no coincide nada como la intención de:

    $ cat chartest.txt | sed 's/\x1b\\x5b//g' | hexdump -C
    00000000  72 65 6d 6f 74 65 3a 20  2a 20 32 37 36 32 35 61  |remote: * 27625a|
    00000010  38 20 28 48 45 41 44 2c  20 6d 61 73 74 65 72 29  |8 (HEAD, master)|
    00000020  20 31 73 74 20 67 69 74  20 63 6f 6d 6d 69 74 1b  | 1st git commit.|
    00000030  5b 4b 0a 72 65 6d 6f 74  65 3a 20 1b 5b 4b 0a 72  |[K.remote: .[K.r|
    00000040  65 6d 6f 74 65 3a 20 1b  5b 4b 0a 72 65 6d 6f 74  |emote: .[K.remot|
    ...

    Así que si usted desea hacer coincidir este personaje, al parecer, usted debe escribir como escapado a la izquierda de corchete, que es \[ – el resto de los valores que puede ser introducido con escapó \x notación:

    $ cat chartest.txt | sed 's/\x1b\[\x4b//g' | hexdump -C
    00000000  72 65 6d 6f 74 65 3a 20  2a 20 32 37 36 32 35 61  |remote: * 27625a|
    00000010  38 20 28 48 45 41 44 2c  20 6d 61 73 74 65 72 29  |8 (HEAD, master)|
    00000020  20 31 73 74 20 67 69 74  20 63 6f 6d 6d 69 74 0a  | 1st git commit.|
    00000030  72 65 6d 6f 74 65 3a 20  0a 72 65 6d 6f 74 65 3a  |remote: .remote:|
    00000040  20 0a 72 65 6d 6f 74 65  3a 20 0a 72 65 6d 6f 74  | .remote: .remot|
    00000050  65 3a 20 0a 72 65 6d 6f  74 65 3a 20 0a 72 65 6d  |e: .remote: .rem|
    00000060  6f 74 65 3a 20 43 75 72  72 65 6e 74 20 62 72 61  |ote: Current bra|
    00000070  6e 63 68 20 6d 61 73 74  65 72 20 69 73 20 75 70  |nch master is up|
    00000080  20 74 6f 20 64 61 74 65  2e 0a                    | to date..|
    0000008a
  8. 2

    He construido vtclean para esto. Que las tiras de las secuencias de escape en el uso de estas expresiones regulares en orden (se explica en regex.txt):

    // handles long-form RGB codes
    ^\033](\d+);([^\033]+)\033\\
    // excludes non-movement/color codes
    ^\033(\[[^a-zA-Z0-9@\?]+|[\(\)]).
    // parses movement and color codes
    ^\033([\[\]]([\d\?]+)?(;[\d\?]+)*)?(.)`)

    Es, además, tiene línea básica-emulación de edición, de modo que la tecla de retroceso y otros el movimiento de los personajes (como la tecla de flecha izquierda) se analiza.

  9. 1

    No tengo suficiente reputación para agregar un comentario a la respuesta dada por Lucas H, pero yo quería compartir la expresión regular que he estado usando para eliminar todos los ASCII Secuencias de Escape.

    sed -r 's~\x01?(\x1B\(B)?\x1B\[([0-9;]*)?[JKmsu]\x02?~~g'
  10. 0

    Tom Hale la respuesta izquierda no deseados códigos, pero era una buena base sobre la que trabajar. La adición de filtros adicionales se borra de sobra, no deseados o de los códigos:

    sed -e "s,^[[[(][0-9;?]*[a-zA-Z],,g" \
    -e "s/^[[[][0-9][0-9]*[@]//" \
    -e "s/^[[=0-9]<[^>]*>//" \
    -e "s/^[[)][0-9]//" \
    -e "s/.^H//g" \
    -e "s/^M//g" \
    -e "s/^^H//" \
    file.dirty > file.clean

    Como esto fue hecho en un no-GNU versión de sed, donde se ve ^[, ^H, y ^M, he utilizado Ctrl-V <Esc>, Ctrl-V Ctrl-H, y Ctrl-V Ctrl-M, respectivamente. El ^> es, literalmente, un quilate (^) y mayor que el carácter, no el Ctrl-<.

    TERM=xterm estaba en uso en el momento.

  11. 0

    Un bash fragmento que he estado utilizando para la extracción (al menos algunos) ANSI colores:

    shopt -s extglob
    while IFS='' read -r line; do
    echo "${line//$'\x1b'\[*([0-9;])[Km]/}"
    done

Dejar respuesta

Please enter your comment!
Please enter your name here