如何使用linux shell脚本删除文件中的^ [和所有转义序列

我们要删除^[和所有的转义序列。

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 

Solutions Collecting From Web of "如何使用linux shell脚本删除文件中的^ [和所有转义序列"

你在找ansifilter吗?


两件事你可以做的:输入文字转义(在bash 🙂

使用键盘输入:

sed's / Ctrl-v Esc // g'

或者

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

或者你可以使用字符转义:

 sed 's/\x1b//g' 

或所有控制字符 :

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

我为了我的目的管理下面的内容,但是这不包括所有可能的ANSI转义 :

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

这删除了m命令,但是对于所有的转义(如@lethalman所说的)使用:

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

另请参阅“ Python正则表达式匹配VT100转义序列 ”。

还有一个常见的转义序列表 。

ansi2txt命令(kbtin包的一部分)似乎在Ubuntu上完成了这项工作。

commandlinefu给出了正确的答案 ,剥离ANSI颜色以及移动命令:

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

在寻找一种从手册页中去掉额外格式的方法时,我偶然发现了这个帖子。 ansifilter做了它,但它远没有预期的结果(例如,所有以前的粗体字符都重复,如SSYYNNOOPPSSIISS )。

对于这个任务,正确的命令是col -bx ,例如:

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

(资源)

只是一个说明; 比方说你有这样的文件(这样的行结束是由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: .[Kr| 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: .[Kr| 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在行结束( 0x0a )之前添加序列0x1b 0x5b 0x4b

请注意,尽管您可以在sed中将0x1b与字面格式\x1b进行匹配,但您无法对\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: .[Kr| 00000040 65 6d 6f 74 65 3a 20 1b 5b 4b 0a 72 65 6d 6f 74 |emote: .[K.remot| ... 

所以,如果你想匹配这个字符,显然你必须把它写成转义的左方括号,也就是\[ – 其余的值可以输入与转义\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 

我为此建了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\?]+)*)?(.)`) 

它另外做了基本的行编辑模拟,所以退格和其他移动字符(如左箭头键)被解析。