输入:
[user@notebook test]$ cat a.txt
music
musicsheet
sheetmusic
[user@notebook test]$ cat a.txt | cat -vte -
$
^[[1mmusic^[[22m$
^[[1mmusicsheet^[[22m$
^[[1msheetmusic^[[22m$
^[[4m^[[24m$
[user@notebook test]$
需要的输出(删除这些有趣的字符后):
[user@notebook test]$ cat a.txt
music
musicsheet
sheetmusic
[user@notebook test]$ cat a.txt | cat -vte -
music$
musicsheet$
sheetmusic$
[user@notebook test]$
问题:如何删除有趣/未知的字符:
^[[1m
^[[22m
^[[4m
^[[24m
这些字符是什么?还能有更多类似的吗?
尝试使用 tr 删除不可打印的字符只会使这些有趣的字符可见并删除换行符,这两者都不好:
[user@notebook test]$ cat a.txt | tr -cd '[:print:]'
[1mmusic[22m[1mmusicsheet[22m[1msheetmusic[22m[4m[24m[user@notebook test]$
答案1
您想要删除CSI...m序列。知道它们包含一系列由 分隔的数字;
,您可以使用 sed 将每个出现的地方替换为空字符串:
esc=$'\e'
sed "s/$esc\[[0-9;]*m//g" a.txt
我正在使用 Bash 语法来编写上面的转义字符。
答案2
@Toby Speight 的解决方案很好。一些额外信息:
通常这些是 ansi“特殊字符”,用于在终端中产生颜色、特殊效果、定位光标等。
例如grep --color=always '[a-z]*music[a-z]*' files > output
会产生这样的字符。
sed -r "s/\x1B\[[0-9;]*[a-zA-Z]//g"
建议:检查您是否将GREP_COLOR
已弃用的变量设置为--color=always
或类似...