我们要删除^[
和所有转义序列。
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
答案 0 :(得分:41)
您在寻找ansifilter吗?
你可以做两件事:输入文字转义(在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!
答案 1 :(得分:17)
为了我的目的,我管理了以下内容,但这并未包含所有可能的ANSI escapes:
sed -r s/\x1b\[[0-9;]*m?//g
这会删除m
个命令,但对于所有转义(由@lethalman评论),请使用:
sed -r s/\x1b\[[^@-~]*[@-~]//g
另见" Python regex to match VT100 escape sequences"。
答案 2 :(得分:15)
commandlinefu gives the correct answer:
sed "s,\x1B\[[0-9;]*[a-zA-Z],,g"
答案 3 :(得分:8)
ansi2txt命令(kbtin包的一部分)似乎在Ubuntu上完美地完成了这项工作。
答案 4 :(得分:7)
在寻找从手册页中删除额外格式的方法时,我偶然发现了这篇文章。 ansifilter做到了,但它远非期望的结果(例如所有以前粗体的字符都是重复的,例如SSYYNNOOPPSSIISS
)。
对于该任务,正确的命令为col -bx
,例如:
groff -man -Tascii fopen.3 | col -bx > fopen.3.txt
答案 5 :(得分:3)
您可以使用以下方法删除所有不可打印的字符:
sed 's/[^[:print:]]//g'
答案 6 :(得分:2)
只是一张纸条;假设您有这样的文件(此类行结尾由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
)之前添加了序列0x5b
0x4b
0x0a
。
请注意 - 虽然您可以在sed中将0x1b
与文字格式\x1b
匹配,但您不能对0x5b
执行相同操作,[
代表左方括号{{1} }:
$ 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|
...
因此,如果您想匹配此字符,显然您必须将其写为转义左方括号,即\[
- 其余值可以使用转义{输入} {1}}表示法:
\x
答案 7 :(得分:2)
我为此建立了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\?]+)*)?(.)`)
它还进行基本的行编辑模拟,因此会解析退格键和其他移动字符(如左箭头键)。
答案 8 :(得分:1)
我没有足够的声誉在answer所给的Luke H中添加注释,但是我确实想分享我用来消除所有ASCII的正则表达式转义序列。
sed -r 's~\x01?(\x1B\(B)?\x1B\[([0-9;]*)?[JKmsu]\x02?~~g'
答案 9 :(得分:1)
-r
为基础的方法,没有sed 's/\x1B\[[0-9;]*[JKmsu]//g'
启用扩展的正则表达式
img{
height: 50%;
background-position: center;
background-repeat: no-repeat;
background-size: cover;
position: relative;
opacity: 25;
}
.carousel-item {
position: relative;
}
.carousel-caption {
text-align: left;
position: absolute;
top: 50%;
left: 30%;
transform: translate(-50%, -50%);
color: white;
}
.over-img{
/* position: absolute;
top: 65%;
left: 6.5%; */
width : 85px;
height: 85px;
}
.pic-sec {
display: flex;
position: absolute;
z-index: 999;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.pic {
display: inline-flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin: 0 10px;
}
.caption {
float: left;
clear: both;
color: white;
}
答案 10 :(得分:0)
Tom Hale's answer留下了不需要的代码,但这是工作的良好基础。添加其他过滤条件可清除掉多余的多余代码:
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
由于是在非GNU版本的sed上完成的,因此您会看到^[
,^H
和^M
,因此我使用Ctrl-V ^>
实际上是一个克拉(^)且大于字符,而不是Ctrl-<。
TERM = xterm当时正在使用。
答案 11 :(得分:0)
我一直在使用的bash片段去除(至少一些)ANSI颜色:
shopt -s extglob
while IFS='' read -r line; do
echo "${line//$'\x1b'\[*([0-9;])[Km]/}"
done
答案 12 :(得分:0)
我的回答
What are these weird ha:// URLs jenkins fills our logs with?
有效地从Jenkins控制台日志文件中删除所有ANSI转义序列(它还处理Jenkins特定的URL,此处不再相关)。
我感谢并感谢Marius Gedminas和pyjama在制定最终解决方案中的贡献。