Text-Processing

從腳本輸出中刪除控製字元(包括控制台程式碼/顏色)

  • June 18, 2021

我可以使用“腳本”命令在命令行記錄互動式會話。但是,這包括所有控製字元顏色程式碼。我可以使用“col -b”刪除控製字元(如退格),但我找不到刪除顏色程式碼的簡單方法。

請注意,我想以正常方式使用命令行,所以不想在那裡禁用顏色 - 我只想從腳本輸出中刪除它們。另外,我知道可以嘗試找到一個正則表達式來解決問題,但我希望有一個更簡單(並且更可靠 - 如果在我開發正則表達式時有一個我不知道的程式碼怎麼辦?)解決方案。

要顯示問題:

spl62 tmp:腳本
腳本啟動,文件是打字稿
spl62 lepl: ls
add-licence.sed build-example.sh 送出測試 push-docs.sh
add-licence.sh build.sh delete-licence.sed setup.py
asn build-test.sh delete-licence.sh src
build-doc.sh 清潔 doc-src test.ini
spl62 lepl:退出
腳本完成,文件是打字稿
spl62 tmp: cat -v 打字稿
腳本開始於 2011 年 6 月 9 日星期四 09:47:27 AM CLT
spl62 lepl: ls ^ M
^[[0m^[[00madd-licence.sed^[[0m ^[[00;32mbuild-example.sh^[[0m ^[[00mcommit-test^[[0m ^[[00;32mpush-docs.sh ^[[0m^M
^[[00;32madd-licence.sh^[[0m ^[[00;32mbuild.sh^[[0m ^[[00mdelete-licence.sed^[[0m ^[[00msetup.py^[[0m^M
^[[01;34masn^[[0m ^[[00;32mbuild-test.sh^[[0m ^[[00;32mdelete-licence.sh^[[0m ^[[01;34msrc^[[0m^M
^[[00;32mbuild-doc.sh^[[0m ^[[00;32mclean^[[0m ^[[01;34mdoc-src^[[0m ^[[00mtest.ini^[[0m^M
spl62 lepl: 退出^M

腳本於 2011 年 6 月 9 日星期四 09:47:29 AM CLT 完成
spl62 tmp: col -b <打字稿
腳本開始於 2011 年 6 月 9 日星期四 09:47:27 AM CLT
spl62 lepl: ls
0m00madd-licence.sed0m 00;32mbuild-example.sh0m 00mcommit-test0m 00;32mpush-docs.sh0m
00;32madd-licence.sh0m 00;32mbuild.sh0m 00mdelete-licence.sed0m 00msetup.py0m
01;34masn0m 00;32mbuild-test.sh0m 00;32mdelete-licence.sh0m 01;34msrc0m
00;32mbuild-doc.sh0m 00;32mclean0m 01;34mdoc-src0m 00mtest.ini0m
spl62 lepl:退出

腳本於 2011 年 6 月 9 日星期四 09:47:29 AM CLT 完成

以下腳本應過濾掉所有 ANSI/VT100/xterm 控制序列(基於ctlseqs)。最低限度的測試,請報告任何不足或過度匹配。

#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
   s/ \e[ #%()*+\-.\/]. |
      \e\[ [ -?]* [@-~] | # CSI ... Cmd
      \e\] .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
      \e[P^_] .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
      \e. //xg;
   print;
}

已知的問題:

  • 不抱怨格式錯誤的序列。這不是這個腳本的用途。
  • 不支持 DCS/PM/APC/OSC 的多行字元串參數。
  • 128–159 範圍內的字節可能會被解析為控製字元,儘管這很少使用。這是一個解析非 ASCII 控製字元的版本(這將破壞包括 UTF-8 在內的某些編碼中的非 ASCII 文本)。
#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
   s/ \e[ #%()*+\-.\/]. |
      (?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
      (?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
      (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
      \e.|[\x80-\x9f] //xg;
   print;
}

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