当前位置: 首页>>技术教程>>正文


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'

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

最佳答案

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 onethis 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.

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/10994.html,未经允许,请勿转载。