【问题标题】:Strip ASCII text of escape characters (ls output redirect)剥离转义字符的 ASCII 文本(ls 输出重定向)
【发布时间】:2011-12-21 22:47:36
【问题描述】:

我正在使用 Mac ssh 连接到一个无头 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
~                                                                
~                                                                
~                                                                
~ 

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

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

我的问题是,我怎样才能非常简单地 ls 文件,将它们重定向到文件,而不使用任何转义字符?首先是什么原因造成的?

谢谢。 myfiles.txt:ASCII 文本,带有转义序列

【问题讨论】:

  • 感谢大家,Ivan、Paul 和 idoimaging。是的,我很久以前将 ls 别名为 ls --color=always ,并且完全忘记了它。 \ls 可以解决问题。

标签: linux shell unix text escaping


【解决方案1】:

您的 ls 看起来像是“ls --color”之类的别名。如果你取消它的别名,你将不会得到任何颜色,这就是转义字符的来源。 alias | grep ls 会告诉你。我将ls 保留为未别名,而是将l 之类的别名设置为'ls --color -F'。

【讨论】:

    【解决方案2】:

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

    要修复,而不是 ls *.pbs 使用以下命令 /bin/ls *.pbs

    这样您就可以不理会您的别名,同时从 ls 获得所需的行为。

    【讨论】:

      【解决方案3】:

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

      \ls *.pbs
      

      【讨论】:

        【解决方案4】:

        它并不明显,但你可以用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
        

        编辑

        对不起,我提供了不好的例子,我会尝试通过屏幕截图来改进它们:

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            你跑的时候看到了什么

            $ alias
            

            我看到以下内容:

            alias ls='ls --color=auto'
            

            系统通常足够聪明,重定向时不会着色,但您可以尝试

            $ unalias ls
            

            然后再试一次以确保您没有得到颜色。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-05-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-06-18
              • 2015-11-08
              相关资源
              最近更新 更多