Special-Characters

如何在保留換行符的同時刪除 ^[[1m ^[[22m ^[[4m ^[[24m 個字元?

  • January 23, 2017

輸入:

[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]$ 

@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或類似…

您想刪除CSIm序列。知道它們包含由 分隔的數字序列;,您可以使用 sed 將每個出現的地方替換為空字元串:

esc=$'\e'
sed "s/$esc\[[0-9;]*m//g" a.txt

我正在使用 Bash 語法來編寫上面的轉義字元。

引用自:https://unix.stackexchange.com/questions/339513