【问题标题】:Using regular expression metacharacters in grep在 grep 中使用正则表达式元字符
【发布时间】:2016-07-24 17:11:43
【问题描述】:

根据系统:cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.2 LTS"

在 Mac 上,这看起来非常好用:

printf "12\na\na12\ndaab\n"|grep "\d" 

我明白了:

12
na12

在上述系统中,相同的命令不会返回任何内容。

虽然处理了正则表达式:printf "12\na\na12\ndaab\n"|grep "^.$" 给出:

a

有什么解释和解决办法吗?

编辑

  • grep (GNU grep) 2.16
  • “\w”就像一个魅力

【问题讨论】:

  • 很高兴知道您正在使用什么 grep。 grep --version 为两者输出了什么?
  • @sjsam 你指的是第一个文本块吗?这只是关于他的 Linux 系统的信息,而不是输入到grep
  • @Kusalananda 我已经为不工作的 grep 添加了这一点(mac 有 grep (BSD grep) 2.5.1-FreeBSD)。
  • @AsTeR 的目标是抓取仅包含数字的行吗?
  • @sjsam 我做了一个简短的例子来重现这个问题,至少有一个数字的行是例子的目标。

标签: ubuntu grep


【解决方案1】:

要使\d 工作,您需要使用 Perl 样式的正则表达式。

printf "12\na\na12\ndaab\n" | grep -P '\d'

给予

12
a12

另一种选择是

printf "12\na\na12\ndaab\n" | grep -E '[[:digit:]]+'

给了

12
a12

警告:正如 grep 手册页所说,Perl 风格的正则表达式是高度实验性的

【讨论】:

    【解决方案2】:

    很少有工具能将\d 识别为数字,而且它只是比显而易见且普遍使用的[0-9] 更简洁的几个字符,所以只需在任何地方使用它来实现便携性:

    $ printf "12\na\na12\ndaab\n"|grep "[0-9]"
    12
    a12
    

    请注意,理论上您应该改用字符类 [:digit:],但我从未听说过与 [0-9] 不同的字符集的语言环境,并且所有 greps 都不会接受它,所以 YMMV wrt 使用它的好处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多