grep 在 Fedora 和 Ubuntu 上的行为不同

grep 在 Fedora 和 Ubuntu 上的行为不同

因此,当我在 Fedora 中运行它时,我看到的是:

$ ls hmm_data/indivA12_AATAAG/refs/par1/
2R-orths.alleles  2R-ref.alleles
$ ls hmm_data/indivA12_AATAAG/refs/par1/ | grep -F '-ref.alleles'
2R-ref.alleles

但是当我在 Ubuntu 上运行时(相同的数据),我没有从 grep 中获得任何结果:

$ ls hmm_data/indivA12_AATAAG/refs/par1/
2R-orths.alleles  2R-ref.alleles
$ ls hmm_data/indivA12_AATAAG/refs/par1/ | grep -F '-ref.alleles'

有什么想法可能发生了什么吗?我怎样才能想出在两个系统上都能正常工作的方法?

答案1

grep -F '-ref.alleles'

相当于:

grep -F -ref.alleles

(撇号之间的字符都不是 shell 元字符,因此引用它们没有任何效果。)

这又相当于:

grep -F -r -e f.alleles

-通过对前缀选项进行正常解析。-e选项带有参数,但-F-r不带有参数。

由于您没有为 grep 指定任何文件,因此默认行为是对 stdin 执行操作...除非该-r选项没有意义,因此它默认为.递归搜索(当前目录)并忽略 stdin。在某些版本中。

您需要在以 as开头的正则表达式之前使用--“没有更多选项”指示符-

grep -F -- -ref.alleles

我找到了没有文件参数的行为发生变化的点-r。那是在 2012 年 3 月 2 日发布的 2.11 版本中。参见发布公告。

影响此行为的 git 提交如下这个这个

如果你grep --version在两台机器上运行,我确信你会发现其中一台机器运行的是 2.11 的错误版本

答案2

领先-是问题所在。要获得相同的结果,请添加--

grep -F -- '-ref.alleles'

man bash

A -- signals the end of options and disables further option
processing. Any arguments after the -- are treated as filenames
and arguments.

答案3

检查 .bashrc 中是否有任何 grep 命令的别名会覆盖其行为。也许这就是问题所在。也可以尝试不带“-F”参数的 grep。

相关内容