web-dev-qa-db-ja.com

Linuxシェルスクリプトを使用して、ファイル内の^ [およびすべてのエスケープシーケンスを削除する方法

^[、およびすべてのエスケープシーケンスを削除します。

sedは機能しておらず、次のエラーが発生しています。

$ 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
43
hasan

ansifilter をお探しですか?


できる2つのこと:リテラルエスケープの入力(bash :)

キーボード入力を使用する:

sed 's/Ctrl-vEsc//g'

代わりに

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

または、文字エスケープを使用できます。

sed 's/\x1b//g'

またはすべての 制御文字

sed 's/[\x01-\x1F\x7F]//g' # NOTE: zaps TAB character too!
43
sehe

commandlinefuは正しい答えを与えます ANSIカラーと移動コマンドを取り除きます:

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

私は目的のために次のもので管理しましたが、これにはすべての可能な ANSIエスケープ が含まれていません:

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

これはmコマンドを削除しますが、すべてのエスケープ(@lethalmanによるコメント)には次を使用します。

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

VT100エスケープシーケンスに一致するPython正規表現 」も参照してください。

一般的なエスケープシーケンスのテーブル もあります。

16
Luke H

ansi2txtコマンド(kbtinパッケージの一部)は、Ubuntuで完璧に機能しているようです。

9
soorajmr

マニュアルページから余分なフォーマットを取り除く方法を探しているときに、私はこの投稿に出くわしました。 ansifilterはそれを行いましたが、期待した結果とはほど遠いものでした(たとえば、SSYYNNOOPPSSIISSのように、以前に太字にされたすべての文字が複製されました)。

そのタスクの正しいコマンドはcol -bx、 例えば:

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

(source)

7
gronostaj

これにより、すべての非印刷可能文字を削除できます。

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

4
pyjama

このために vtclean を作成しました。これらの正規表現を順番に使用してエスケープシーケンスを削除します( 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\?]+)*)?(.)`)

さらに、基本的な行編集エミュレーションを行うため、バックスペースやその他の移動文字(左矢印キーなど)が解析されます。

2
lunixbochs

ご注意ください。次のようなファイルがあるとしましょう(このような行末はgitリモートレポートによって生成されます):

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

バイナリでは、これは次のようになります。

$ 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

ここでgitが行末(0x1b)の前にシーケンス0x5b0x4b0x0aを追加することがわかります。

0x1bをsedのリテラル形式\x1bと一致させることはできますが、左角括弧0x5bを表す[に対して同じことはできません。

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

余分なバックスラッシュ\で表現をエスケープできると思うかもしれません-これは\\x5bになります;しかし、それは「合格」しますが、意図したとおりには一致しません。

$ 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|
...

したがって、この文字に一致させたい場合は、明らかにmustエスケープされた左角かっこ、つまり\[として記述してください-残りの値はエスケープされた\x表記法:

$ 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

answerLuke H によって与えられたコメントにコメントを追加するほどの評判はありませんが、排除に使用してきた正規表現を共有したかったのです。すべてのASCIIエスケープシーケンス。

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

(少なくともいくつかの)ANSIカラーを除去するために使用してきたbashスニペット:

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

Tom Haleの答え は不要なコードを残しましたが、作業の良いベースでした。追加のフィルタリングを追加すると、不要なコードが残ります:

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

これはsedの非GNUバージョンで行われたため、^[^H、および^M、Ctrl-V <Esc>、Ctrl-V Ctrl-H、およびCtrl-V Ctrl-Mをそれぞれ使用しました。 ^>は、文字通りカラット(^)であり、Ctrl- <ではなく、大なり記号です。

TERM = xtermはその時点で使用中でした。

0
kbulgrien