问题描述
因此,当我在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'
有什么想法怎么回事?如何提出在两个系统上都可以使用的相同功能?
最佳答案
grep -F '-ref.alleles'
等效于:
grep -F -ref.alleles
(撇号之间的字符都不是 shell 元字符,因此引号无效。)
这等效于:
grep -F -r -e f.alleles
通过对-
前缀选项的常规解析。 -e
选项接受一个参数,但-F
和-r
不接受。
由于您没有为grep指定任何文件,因此默认行为是对stdin进行操作,只是-r
选项没有意义,因此它默认以递归方式搜索.
(当前目录),而忽略stdin。在某些版本中。
您需要在以-
开头的正则表达式之前使用--
“没有更多选项”指示符,如下所示
grep -F -- -ref.alleles
我跟踪了没有文件参数的-r
行为的变化点。它的版本为2.11,2012年3月2日发布。See the release announcement.
影响行为的git commit是this one和this one。
如果您在两台计算机上运行grep --version
,我相信您会发现其中一台位于2.11的错误一侧
次佳答案
前导-
是问题所在。要获得相同的结果,请添加--
:
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.