Wir möchten ^[
und alle Escape-Sequenzen entfernen.
sed funktioniert nicht und gibt uns diesen Fehler:
$ 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 ?
Aufgrund des Tagespreises: inserire la fuga letterale (in bash :)
Utilizzo della tastiera:
sed 's/Ctrl-vEsc//g'
alternativamente
sed 's/Ctrl-vCtrl-[//g'
Oppure puoi usare i caratteri di escape:
sed 's/\x1b//g'
o per tutti caratteri di controllo :
sed 's/[\x01-\x1F\x7F]//g' # NOTE: zaps TAB character too!
Ich habe es für meine Zwecke geschafft, aber dies schließt nicht alle möglichen ANSI-Escape ein:
sed -r s/\x1b\[[0-9;]*m?//g
Dadurch werden m
-Befehle entfernt, aber für alle Escapezeichen (wie von @lethalman kommentiert) wird Folgendes verwendet:
sed -r s/\x1b\[[^@-~]*[@-~]//g
Siehe auch " Python-Regex zur Anpassung der VT100-Escape-Sequenzen ".
Es gibt auch eine Tabelle der üblichen Escape-Sequenzen .
commandlinefu gibt die richtige Antwort die ANSI-Farben sowie Bewegungsbefehle entfernt:
sed "s,\x1B\[[0-9;]*[a-zA-Z],,g"
der Befehl ansi2txt (Teil des kbtin-Pakets) scheint die Arbeit auf Ubuntu perfekt auszuführen.
Ich bin über diesen Beitrag gestolpert, als ich nach einer Möglichkeit suchte, zusätzliche Formatierungen von Manpages zu entfernen. ansifilter hat es getan, aber es war weit von dem gewünschten Ergebnis entfernt (zum Beispiel wurden alle zuvor fettgedruckten Zeichen dupliziert, wie SSYYNNOOPPSSIISS
).
Für diese Aufgabe wäre der korrekte Befehl col -bx
, zum Beispiel:
groff -man -Tascii fopen.3 | col -bx > fopen.3.txt
Ich habe vtclean dafür gebaut. Es entfernt Escape-Sequenzen mit diesen regulären Ausdrücken in der angegebenen Reihenfolge (erklärt in regex.txt ):
// handles long-form RGB codes
^\033](\d+);([^\033]+)\033\\
// excludes non-movement/color codes
^\033(\[[^[email protected]\?]+|[\(\)]).
// parses movement and color codes
^\033([\[\]]([\d\?]+)?(;[\d\?]+)*)?(.)`)
Darüber hinaus können Sie die grundlegende Zeilenbearbeitungsemulation ausführen, so dass Backspace und andere Bewegungszeichen (wie die linke Pfeiltaste) analysiert werden.
Nur eine Notiz; Angenommen, Sie haben eine Datei wie diese (diese Zeilenenden werden von git
Remote-Berichten generiert):
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
In binär sieht das so aus:
$ 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 ist sichtbar, dass git
hier die Sequenz 0x1b
0x5b
0x4b
vor dem Zeilenende (0x0a
) hinzufügt.
Beachten Sie, dass Sie zwar 0x1b
mit einem wörtlichen Format \x1b
in sed abgleichen können, Sie können jedoch NICHT dasselbe für 0x5b
tun, das die linke eckige Klammer [
darstellt:
$ cat chartest.txt | sed 's/\x1b\x5b//g' | hexdump -C
sed: -e expression #1, char 13: Invalid regular expression
Sie denken vielleicht, Sie könnten die Darstellung mit einem zusätzlichen Backslash \
beenden, der als \\x5b
endet. aber während das "geht" - es stimmt nicht mit irgendetwas wie beabsichtigt:
$ 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|
...
Wenn Sie also mit diesem Zeichen übereinstimmen möchten, müssen Sie es als verstrichene eckige Klammer schreiben, d. H. \[
. Die restlichen Werte können dann mit der ungezeichneten \x
-Notation eingegeben werden:
$ 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
Sie können damit alle nicht druckbaren Zeichen entfernen:
sed 's/[^[:print:]]//g'
Ein Bash-Snippet, mit dem ich (zumindest einige) ANSI-Farben entfernt habe:
shopt -s extglob
while IFS='' read -r line; do
echo "${line//$'\x1b'\[*([0-9;])[Km]/}"
done
Tom Hales Antwort hat unerwünschte Codes hinterlassen, war aber eine gute Basis für die Arbeit. Hinzufügen zusätzlicher Filterung, die übrig gebliebene, unerwünschte Codes gelöscht haben:
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
Da dies auf einer Nicht-GNU-Version von sed ausgeführt wurde, in der ^[
, ^H
und ^M
angezeigt wird, habe ich Ctrl-V <Esc>, Ctrl-V Ctrl-H bzw. Ctrl-V Ctrl-M verwendet. Der ^>
ist buchstäblich ein Carat (^) und ein Zeichen größer als, nicht Strg- <.
TERM = xterm wurde zu dieser Zeit verwendet.