webentwicklung-frage-antwort-db.com.de

Entfernen von ^ [und aller Escape-Sequenzen in einer Datei mithilfe von Linux-Shell-Skript

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

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

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

17
Luke H

commandlinefu gibt die richtige Antwort die ANSI-Farben sowie Bewegungsbefehle entfernt:

sed "s,\x1B\[[0-9;]*[a-zA-Z],,g"
10
Tom Hale

der Befehl ansi2txt (Teil des kbtin-Pakets) scheint die Arbeit auf Ubuntu perfekt auszuführen.

8
soorajmr

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

(Quelle)

5
gronostaj

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.

2
lunixbochs

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

Sie können damit alle nicht druckbaren Zeichen entfernen:

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

1
pyjama

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

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.

0
kbulgrien

Ich habe nicht genug Ansehen, um einen Kommentar zu der answer von Luke H hinzuzufügen, aber ich wollte den regulären Ausdruck, den ich verwendet habe, um alle ASCII Escape-Sequenzen.

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