将输出从bash脚本重定向到文件时,我在文件中得到特殊字符。例如,
for file in *; do echo $file; done > output.txt
然后如果我cat output.txt
cat output.txt
我得到了
file1.txt
file2.txt
file3.txt
output.txt
但是在编辑文件时,我看到了:
^[[0m^[[0mfile1.txt
^[[0m^[[0mfile2.txt
^[[0m^[[0mfile3.txt
^[[0m^[[0moutput.txt
如何避免那些令人讨厌的角色?
解决方案:
我在.bashrc中有以下行:
trap 'echo -ne "\e[0m"' DEBUG
通过删除它,我解决了问题。
谢谢大家的帮助。
答案 0 :(得分:5)
这些是ANSI转义码,用于格式化终端中的文本。而不是试图删除它们,你应该首先防止它们被写入。
您确定从您发布的确切代码中获得此信息吗?如果是这样,您的文件实际上会在您的名字中包含这些字符,您只需重命名它们即可。
更常见的方法是使用输出ANSI转义序列的工具。这是显示相同问题的可重现方式:
ls --color=always > file
如果您发布的代码是一个未经测试的示例,您应该查找负责ANSI代码的工具并使其停止(特别确定您没有循环输出ls。)
以下是您看到的问题的一个示例,其中touch
代表某些进程/脚本意外创建了带有ANSI转义的文件名:
# Reproduce the problem
$ touch $'\x1B[0m\x1B[0mfile.txt'
# Symptoms of the problem
$ ls *.txt
?[0m?[0mfile.txt
$ for f in *.txt; do echo "$f"; done
file.txt
$ for f in *.txt; do echo "$f"; done | cat -v
^[[0m^[[0mfile.txt
# Fix the problem by renaming the bad files
$ crud=$'\x1B[0m'; for f in *"$crud"*; do mv "$f" "${f//$crud/}"; done
# Now works as expected
$ ls *.txt
file.txt
$ for f in *.txt; do echo "$f"; done
file.txt
$ for f in *.txt; do echo "$f"; done | cat -v
file.txt
答案 1 :(得分:0)
您可以使用ls -f选项(禁用颜色)来避免那些令人讨厌的字符,如下所示:
for file in $(ls -f *); do echo $file; done > output.txt
保
答案 2 :(得分:0)
运行raw ls命令
/ bin中/ LS
作为
/ bin / ls> your_file
您将避免输出文件your_file中的特殊字符。