4

我正在执行一个非常基本的命令,过去从未给我带来麻烦,但现在却莫名其妙地返回了不需要的字符。

我在 linux 上的 BASH 中,只想搜索一个目录并创建一个包含与模式匹配的文件名的文件:

ls | grep "*.file_ID" > my_list.txt

...这很好用,如果我收集数据:

   cat my_list.txt
       seriesA.file_ID
       seriesB.file_ID
       seriesC.file_ID

但是,当我尝试将此文件提供给下游进程时,我不断收到一个奇怪的错误,好像该文件没有正确格式化为文件名列表。当我在 vim 中打开文件以显示任何不必要的字符时,我发现文件实际上如下所示:

vi my_list.txt

^[[00mseriesA.file_ID^[[00m
^[[00mseriesB.file_ID^[[00m
^[[00mseriesC.file_ID^[[00m

出于某种原因,每一行都以字符开头和结尾^[[00m。如果我删除这些字符,所有下游流程都可以正常工作。但是,我需要让我的脚本自动创建这样一个文件列表,所以我不能继续手动删除这些字符。

有谁知道是什么产生了^[[00m角色?我不知道它们来自哪里,并且需要能够在没有它们的情况下生成文件。

谢谢!

4

5 回答 5

8

可能您的GREP_OPTIONS环境变量包含--color=always,这会导致输出填充控制字符,即使通过管道传输到文件也是如此。

改为使用--color=auto

http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html

更好的是,不要使用grep

ls *.file_ID > my_list.txt
于 2013-07-16T19:02:54.343 回答
2
  • 通常它是自动的=>grep --color=auto

  • 如果它通过管道传输到一个看起来像这样的 csv 文件^[[00...^[[00m

  • 您必须在终端中输入:
    grep --color=auto "your regex" > example.csv

  • 如果您希望它成为无需--color=auto每次都输入“”的永久情况,请在终端中输入:
    export GREP_OPTIONS='--color=auto'

更多信息: https ://linuxcommando.blogspot.com/2007/10/grep-with-color-output.html

于 2020-05-07T00:15:01.540 回答
1

这应该会解决它(假设 GNU find 并且没有目录遍历):

find . -maxdepth 1 -type f -name "*.file_ID" -printf "%f\n" > my_list.txt

例子:

~> ls *file_ID*
a.file_ID  b.file_ID  c.file_ID

~> find . -maxdepth 1 -type f -name "*.file_ID" -printf "%f\n" > my_list.txt

~> cat my_list.txt
a.file_ID
b.file_ID
c.file_ID

至于 "^[[00m" 字符,请检查您的 ls 选项:

~> alias -p | grep "ls="

你可能会得到类似的东西:

alias ls='/bin/ls $LS_OPTIONS'

如果是这样,请检查 env :

~> env | grep LS_OP
LS_OPTIONS=-N --color=tty -T 0

您引用的字符串用于关闭颜色,因此您的外壳可能已设置为显示颜色。删除和/或更改 ls 别名应该可以解决它。

于 2013-07-16T21:44:23.087 回答
1

不要使用 ls

printf "%s\n" *.file_ID > my_list.txt
于 2013-07-16T18:53:57.667 回答
0

奇怪的字符,例如^[[00m用于为输出着色的转义字符。ls最有可能通过您环境中的别名启用颜色输出。

为避免获取这些颜色字符,您可以尝试ls使用反斜杠暂时禁用别名:

\ls *.txt

或者您可以改用printf命令。

printf "%s\n" *.txt
于 2018-03-18T20:45:56.127 回答