剥离转义字符的ASCII文本(ls输出重定向)

时间:2011-12-21 22:47:36

标签: linux shell unix text escaping

我正在使用Mac ssh'ing进入无头RedHat盒子,我需要为下游程序创建一个文件列表来操作。

当我重定向ls的输出时,创建的文件有一堆转义字符,而我的下游脚本无法正确读取文件名。当我创建文件cat时,一切看起来都很好:

sdt5z@franklin:~/cufflinks$ ls *.pbs
01_SL8426.pbs  03_SL8428.pbs  09_SL8891.pbs
02_SL8427.pbs  04_SL8429.pbs

sdt5z@franklin:~/cufflinks$ ls *.pbs > myfiles.txt

sdt5z@franklin:~/cufflinks$ cat myfiles.txt 
01_SL8426.pbs
02_SL8427.pbs
03_SL8428.pbs
04_SL8429.pbs
09_SL8891.pbs

但是如果我在vim中打开文件,这就是它的样子(所有小^[[^[字符在我的终端模拟器中都是蓝色的):

  1 ^[[0m^[[0m01_SL8426.pbs^[[0m
  2 ^[[0m02_SL8427.pbs^[[0m
  3 ^[[0m03_SL8428.pbs^[[0m
  4 ^[[0m04_SL8429.pbs^[[0m
  5 ^[[0m09_SL8891.pbs^[[0m
  6 ^[[m
~                                                                
~                                                                
~                                                                
~ 

运行file命令显示该文件具有转义序列。

sdt5z@franklin:~/cufflinks$ file myfiles.txt 
myfiles.txt: ASCII text, with escape sequences

我的问题是,我怎样才能简单地将文件重定向到文件,没有任何转义字符?是什么原因造成这种情况?

感谢。 myfiles.txt:包含转义序列的ASCII文本

6 个答案:

答案 0 :(得分:5)

您的ls看起来像是“ls --color”之类的别名。如果你取消它,你将不会得到任何着色,这是转义字符的来源。 alias | grep ls会告诉你。我将ls置于不合理的位置,而是将l之类的内容替换为“ls --color -F”。

答案 1 :(得分:2)

在这种情况下,我认为来自ls的附加信息正在打印到文件中。 cat命令正在使用该信息为终端中的输出着色,而vim正在显示文件中的颜色字符。

要修复,请使用以下命令ls *.pbs

而不是/bin/ls *.pbs

通过这种方式,您可以单独保留别名,同时从ls获得所需的行为。

答案 2 :(得分:2)

您可以这样做,而不是更改别名:

\ls *.pbs

答案 3 :(得分:2)

它不明显,但你可以用echo换行,echo将删除所有ANSI转义字符。 (见截图)

FS结构

daniel@synapse:/tmp/test$ tree
.
├── archive.tar.bz2
├── archive.tar.gz
├── dir1
│   └── file.txt
├── dir2
│   └── file.pdf
└── image.png

2 directories, 5 files

列出商品 - 只是商品

daniel@synapse:/tmp/test$ for ITEM in `echo *`; do echo ${ITEM}; done
archive.tar.bz2
archive.tar.gz
dir1
dir2
image.png

列出项目 - 具有相对路径

daniel@synapse:/tmp/test$ for ITEM in `echo ./*`; do echo ${ITEM}; done
./archive.tar.bz2
./archive.tar.gz
./dir1
./dir2
./image.png

列出项目 - 使用绝对路径

daniel@synapse:/tmp/test$ for ITEM in `echo $(pwd)/*`; do echo ${ITEM}; done
/tmp/test/archive.tar.bz2
/tmp/test/archive.tar.gz
/tmp/test/dir1
/tmp/test/dir2
/tmp/test/image.png

修改

抱歉,我提供了不好的例子,我会尝试通过屏幕截图改进它们: ls: echo removed ANSI escape chars

grep: echo removed ANSI escape chars

答案 4 :(得分:1)

看起来ls命令认为它在终端中执行即使你正在输出输出。您可以尝试--color=never选项:

ls --color=never *.pbs > myfiles.txt

答案 5 :(得分:1)

当你跑步时你看到了什么

$ alias

我看到以下内容:

alias ls='ls --color=auto'

系统通常非常智能,在重定向时不会着色,但您可以尝试

$ unalias ls

然后再试一次,确保你没有颜色。