web-dev-qa-db-fra.com

Comment supprimer ^ [et toutes les séquences d'échappement d'un fichier à l'aide de scripts shell linux

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
34
hasan

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!
43
sehe

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

17
Luke H

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"
10
Tom Hale

la commande ansi2txt (qui fait partie du paquet kbtin) semble fonctionner parfaitement sous Ubuntu.

8
soorajmr

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

(la source)

5
gronostaj

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.

2
lunixbochs

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 0x1b0x5b0x4b 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
2
sdaau

Vous pouvez supprimer tous les caractères non imprimables avec ceci:

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

1
pyjama

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
0
rdesgroppes

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.

0
kbulgrien

Je n'ai pas assez de réputation pour ajouter un commentaire à la réponse answer donnée par Luke H , mais je souhaitais partager l'expression régulière que j'avais utilisée pour éliminer tous les ASCII Séquences d'échappement.

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