我正在做一个非常基本的命令,过去从来没有给我带来麻烦,但现在莫名其妙地回复了不受欢迎的角色。
我在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
个字符的是什么?我不知道它们来自哪里,并且需要能够在没有它们的情况下生成文件。
谢谢!
答案 0 :(得分: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
答案 1 :(得分:1)
printf "%s\n" *.file_ID > my_list.txt
答案 2 :(得分:1)
这应该照顾它(假设GNU查找并且没有目录遍历):
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”字符而言,检查你的选项:
~> alias -p | grep "ls="
你可能会得到类似的东西:
alias ls='/bin/ls $LS_OPTIONS'
如果是这样,请检查env:
~> env | grep LS_OP
LS_OPTIONS=-N --color=tty -T 0
您引用的字符串用于关闭颜色,因此您的shell可能已设置为显示颜色。删除和/或更改ls别名应该解决它。
答案 3 :(得分:1)
通常是自动=> grep --color=auto
如果它通过管道传输到看起来像^[[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
答案 4 :(得分:0)
奇怪的字符如^[[00m
是用于着色输出的转义字符。 ls
的颜色输出很可能是通过环境中的别名启用的。
为避免获取这些颜色字符,您可以尝试使用反斜杠暂时禁用ls
别名:
\ls *.txt
或者您可以使用printf
命令。
printf "%s\n" *.txt