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

has*_*san 47 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
Run Code Online (Sandbox Code Playgroud)

seh*_*ehe 47

你在寻找ansifilter吗?


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

使用键盘输入:

sed 's/Ctrl-vEsc//g'
Run Code Online (Sandbox Code Playgroud)

或者

sed 's/Ctrl-vCtrl-[//g'
Run Code Online (Sandbox Code Playgroud)

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

sed 's/\x1b//g'
Run Code Online (Sandbox Code Playgroud)

或者对于所有控制字符:

sed 's/[\x01-\x1F\x7F]//g' # NOTE: zaps TAB character too!
Run Code Online (Sandbox Code Playgroud)

  • Lovin'键盘显示+1! (9认同)

Tom*_*ale 22

commandlinefu给出了正确的答案,它可以删除ANSI颜色以及移动命令:

sed "s,\x1B\[[0-9;]*[a-zA-Z],,g"
Run Code Online (Sandbox Code Playgroud)

  • Bash 还允许您说 `sed $'s,\x1B\[[0-9;]*[a-zA-Z],,g'`,其中单引号之前的美元符号很重要(它会生成“C -style”字符串)。 (9认同)
  • 这适用于gnu sed,但由于\ x1B而无法移植到其他sed实现(例如,bsd).对于其他seds,您可以使用原始转义字符(您可以使用ctrl-v前缀在命令行上插入文字转义字符). (2认同)

Luk*_*e H 17

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

sed -r s/\x1b\[[0-9;]*m?//g
Run Code Online (Sandbox Code Playgroud)

这将删除m命令,但对于所有转义(由@lethalman评论),使用:

sed -r s/\x1b\[[^@-~]*[@-~]//g
Run Code Online (Sandbox Code Playgroud)

另请参阅" Python正则表达式以匹配VT100转义序列 ".

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

  • 请注意,在BSD(Mac OS X)上,sed不支持ANSI-C转义序列,如`\ x1b`.因此,在这些环境中,可能需要通过扩展转义字节来依赖shell:`sed's /'"$(printf'\ x1b')"'\ [[^ @ - 〜]*[@ - 〜] // g'` - 在bash4中测试了BSD和GNU sed,似乎工作正常. (2认同)

小智 10

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

  • 看起来需要将“ansi2txt”管道传输到“col -b”才能删除所有内容。 (3认同)
  • 这在`colorized-logs`包中 (2认同)

gro*_*taj 7

在寻找一种从手册页中删除额外格式的方法时,我偶然发现了这篇文章.ansifilter做到了,但它远远不是想要的结果(例如所有以前粗体的字符都是重复的,比如SSYYNNOOPPSSIISS).

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

groff -man -Tascii fopen.3 | col -bx > fopen.3.txt
Run Code Online (Sandbox Code Playgroud)

(资源)

  • `i++`为此。伙计们,不要重新发明这个轮子。另见`colcrt` (2认同)

小智 7

我没有足够的声誉为Luke H给出的答案添加评论,但我确实想分享我一直用来消除所有 ASCII 转义序列的正则表达式。

sed -r 's~\x01?(\x1B\(B)?\x1B\[([0-9;]*)?[JKmsu]\x02?~~g'
Run Code Online (Sandbox Code Playgroud)


lun*_*chs 6

我为此构建了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\?]+)*)?(.)`)
Run Code Online (Sandbox Code Playgroud)

它还执行基本的行编辑模拟,因此可以解析退格键和其他移动字符(如左箭头键)。


小智 5

您可以使用以下方法删除所有不可打印的字符:

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

  • 但这只是删除了不可见的字符;所以像“^[[0;31m”这样的东西会简单地变成“[0;31m”。 (3认同)
  • @rth 不清楚你的提议是什么;恰好修剪四个字符是错误的,因为转义序列的长度不同。您必须编写一个转义序列解析器才能知道要删除多少个。 (3认同)

pal*_*lik 5

sed基于方法,无需扩展正则表达式-r

sed 's/\x1B\[[0-9;]*[JKmsu]//g'
Run Code Online (Sandbox Code Playgroud)