grep在Fedora和Ubuntu上的表现有所不同


13

因此,当我在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'

有什么想法怎么回事?如何提出在两个系统上都可以使用的相同功能?


怎么ls *-ref.alleles
glenn jackman 2014年

@glennjackman,我想到了这一点,但有人做到了这一点,并在我要修复的bash脚本中注释了该行:-)我只能假定他们有原因...
Greg_the_Ant 2014年

Answers:


30
grep -F '-ref.alleles'

等效于:

grep -F -ref.alleles

(撇号之间的字符都不是外壳元字符,因此引号无效。)

这等效于:

grep -F -r -e f.alleles

通过-前缀选项的正常解析。该-e选项需要一个说法,但-F-r没有。

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

你需要使用--一个正则表达式之前,“没有更多的选择”的指标,开始与-作为

grep -F -- -ref.alleles

我追踪了-r没有文件参数的情况发生变化的地方。它是2012年3月2日发行的2.11版。请参阅发行公告。

影响行为的git commit是这一这一

如果您grep --version在两台计算机上运行,我相信您会发现其中一台位于2.11的错误一侧


很好的答案,感谢您一直对行为发生变化的版本进行研究。
richardneish

2
哇谢谢。没错,我有grep 2.6.3 vs grep 2.14。
Greg_the_Ant 2014年

6

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

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.

1
为什么在Ubuntu和Fedora上有区别?难道对他们两个都不会产生相同的负面结果吗?
胶粘剂

谢谢。如果将此命令通过管道传递到另一个命令中,-会在那引起任何问题吗?还是仅适用于显示它的命令?
Greg_the_Ant 2014年

4
bash手册页并不真正相关。它说明了--bash自己的命令行的处理方式,该方式独立于grep对的理解--。它们的工作方式相同,因为这是一个通用约定,但总的来说,您的Shell手册页没有告诉您任何其他程序的参数含义。

1

检查.bashrc,如果grep命令上有任何别名可以覆盖它的行为。也许是问题所在。也可以尝试不带“ -F”参数的grep。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.