【问题标题】:bash not parsing (cat + grep) correctlybash 无法正确解析(cat + grep)
【发布时间】:2016-06-16 15:38:44
【问题描述】:

我有一个文本文件1.grep

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

为了让我的 grepping 更快,我在 bash 中执行以下操作

cat 1.grep | bash &gt; 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 文件名是目录?

【问题讨论】:

  • 你不想做cat foo|bash,你可以把foo做成带有hashbang的shell脚本,+x
  • cat_ing_ 到 bash 无济于事。就做grep -P -e "^&lt;job.+type.+rule" "Emake-4agents-1st-10-25-51.53.xml" &gt; 1.search
  • @agc 当我有许多其他参数时,这是不切实际的。这是一个简单的例子。
  • bash 1.grep 将执行 1.grep 中的命令。为什么需要猫?
  • @matzeri 你是对的。问题是我仍然得到同样的错误$ bash 1.grep : No such file or directory25-51.53.xml

标签: linux bash shell grep cygwin


【解决方案1】:

直接的问题是文件 1.grep 是 DOS/Windows 格式,并且在行尾有一个回车符和换行符。 Windows 将这两个字符组合视为行尾标记,但像 bash(和 grep 和 ...)这样的 unix 工具只会将换行符视为行尾标记,所以回车return 被视为行的一部分。结果,它试图从名为“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 格式存储的文本编辑器。

但是,我也必须同意几个 cmets 所说的使用 cat | bash 是……很奇怪。我不确定你在更大的范围内想要完成什么,但我想不出在任何情况下这都是“正确”的方式。

【讨论】:

  • 耶!谢谢。我广泛使用记事本++,我遵循这个stackoverflow.com/questions/8195839/… 总是让它​​使用\n 换行。 bash &lt;text_file&gt; 现在可以使用了。
  • 为了将来参考,您可以随时使用 tr(或 sed)去除 ^M 字符:tr '\r' '\n' &lt; file.txt。另外,如前所述,避免使用`cat file |别的东西。谷歌 UUOC :)
猜你喜欢
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 2019-03-01
  • 1970-01-01
  • 2019-06-25
相关资源
最近更新 更多