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

时间:2011-06-30 12:16:09

标签: linux shell scripting

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

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

13 个答案:

答案 0 :(得分:41)

您在寻找ansifilter吗?


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

使用键盘输入:

sed 's/Ctrl-vEsc//g'

替代地

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

或者您可以使用角色转义:

sed 's/\x1b//g'

或所有control characters

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"。

还有table of common escape sequences

答案 2 :(得分:15)

剥离ANSI颜色和移动命令的

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

(source)

答案 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-V Ctrl-H和Ctrl-V Ctrl-M。 ^>实际上是一个克拉(^)且大于字符,而不是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 Gedminaspyjama在制定最终解决方案中的贡献。