bash没有正确解析(cat + grep)

时间:2016-06-16 15:38:44

标签: linux bash shell grep cygwin

我有一个文本文件1.grep

grep -P -e "^<job.+type.+rule" "Emake-4agents-1st-10-25-51.53.xml"

为了让我的grepping更快,我在bash

中执行以下操作

cat 1.grep | bash > 1.search

这通常正常,但在这种情况下,我得到以下内容:

$ cat 1.grep
grep -P -e "^<job.+type.+rule" "Emake-4agents-1st-10-25-51.53.xml"

$ cat 1.grep | bash > 2.search
: No such file or directory25-51.53.xml

为什么bash认为我的.xml文件名是目录?

1 个答案:

答案 0 :(得分:2)

当前的问题是文件1.grep是DOS / Windows格式,并且在行尾有一个回车符后跟换行符。 Windows将这两个字符组合视为行尾标记,但是bash(以及grep和...)等unix工具只会将换行视为行尾标记,因此回车被视为生产线的一部分。因此,它试图从名为“Emake-4agents-1st-10-25-51.53.xml ^ M”(其中^M表示回车)的文件中读取,该文件不存在,因此它在中间打印一个带回车符的错误消息:

cat: Emake-4agents-1st-10-25-51.53.xml^M
: No such file or directory

...回车使第二部分覆盖第一部分,给出你看到的神秘结果。

解决方案:使用dos2unix之类的内容将文件转换为unix(仅限换行)格式,并使用以unix格式存储的文本编辑器。

但是,我还必须同意几条评论说使用cat | bash是......简单的奇怪。我不确定你想要在更大的范围内完成什么,但我无法想到任何情况下这是“正确”的方式。