Nous voulons supprimer ^[
et toutes les séquences d'échappement.
sed ne fonctionne pas et nous donne cette erreur:
$ 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
Stai cercando ansifilter ?
Due cose che puoi fare: inserire la fuga letterale (en bash :)
Utilisation de la saveur:
sed 's/Ctrl-vEsc//g'
alternativamente
sed 's/Ctrl-vCtrl-[//g'
Oppure puoi usare i caratteri di escape:
sed 's/\x1b//g'
o par tutti caratteri di controlo :
sed 's/[\x01-\x1F\x7F]//g' # NOTE: zaps TAB character too!
J'ai réussi à utiliser les éléments suivants pour mes besoins, mais cela n'inclut pas tous les évasements possibles de ANSI :
sed -r s/\x1b\[[0-9;]*m?//g
Ceci supprime les commandes m
, mais pour toutes les échappées (commentées par @lethalman), utilisez:
sed -r s/\x1b\[[^@-~]*[@-~]//g
Voir aussi " Une expression rationnelle Python pour faire correspondre les séquences d'échappement VT100 ".
Il existe également une table des séquences d'échappement courantes .
commandlinefu donne la bonne réponse qui supprime les couleurs ANSI ainsi que les commandes de mouvement:
sed "s,\x1B\[[0-9;]*[a-zA-Z],,g"
la commande ansi2txt (qui fait partie du paquet kbtin) semble fonctionner parfaitement sous Ubuntu.
Je suis tombé sur ce message lorsque je cherchais un moyen de supprimer le formatage supplémentaire des pages de manuel. ansifilter l'a fait, mais c'était loin d'être le résultat souhaité (par exemple, tous les caractères précédemment en gras étaient dupliqués, comme SSYYNNOOPPSSIISS
).
Pour cette tâche, la commande correcte serait col -bx
, par exemple:
groff -man -Tascii fopen.3 | col -bx > fopen.3.txt
J'ai construit vtclean pour cela. Il supprime les séquences d'échappement en utilisant ces expressions régulières dans l'ordre (expliqué dans 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\?]+)*)?(.)`)
De plus, il effectue une émulation d'édition de ligne de base, ainsi les caractères de retour arrière et autres mouvements (comme la flèche gauche) sont analysés.
Juste une note; Disons que vous avez un fichier comme celui-ci (ces fins de lignes sont générées par les rapports git
distants):
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 binaire, cela ressemble à ceci:
$ 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
Il est visible que git
ajoute ici la séquence 0x1b
0x5b
0x4b
avant la fin de la ligne (0x0a
).
Notez que - bien que vous puissiez faire correspondre le 0x1b
avec un format littéral \x1b
dans sed, vous ne POUVEZ PAS faire de même pour 0x5b
, qui représente le crochet gauche [
:
$ cat chartest.txt | sed 's/\x1b\x5b//g' | hexdump -C
sed: -e expression #1, char 13: Invalid regular expression
Vous pourriez penser que vous pouvez échapper à la représentation avec une barre oblique inverse supplémentaire \
- qui se termine par \\x5b
; mais alors que cela "passe" - cela ne correspond à rien comme prévu:
$ 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|
...
Donc si vous voulez faire correspondre ce caractère, apparemment devez l'écrire comme un crochet gauche, c'est-à-dire \[
- le reste des valeurs peut être entré avec la notation \x
échappée:
$ 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
Vous pouvez supprimer tous les caractères non imprimables avec ceci:
sed 's/[^[:print:]]//g'
Un extrait bash que j'utilise pour supprimer (au moins certaines) couleurs ANSI:
shopt -s extglob
while IFS='' read -r line; do
echo "${line//$'\x1b'\[*([0-9;])[Km]/}"
done
La réponse de Tom Hale laissé des codes non désirés, mais était une bonne base de travail. Ajout de filtrage supplémentaire effacé codes restants et indésirables:
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
Comme cela a été fait sur une version non GNU de sed, où vous voyez ^[
, ^H
et ^M
, j'ai utilisé Ctrl-V <Échap>, Ctrl-V Ctrl-H et Ctrl-V Ctrl-M respectivement. Le ^>
est littéralement un caractère carat (^) et supérieur à, pas Ctrl- <.
TERM = xterm était utilisé à l'époque.