【问题标题】:Supported regex escape sequences in grepgrep 中支持的正则表达式转义序列
【发布时间】:2013-10-18 10:07:54
【问题描述】:

我试图使用 \sgrep 正则表达式中指定 while 空格,但似乎 grep 无法识别它。 grep -Eegrep 也无法使用它。

这是我的试验:

$ echo '   foo' | grep '^ *foo'
   foo
$ echo '   foo' | grep '^\s*foo'  <-- **No Output**
$ echo '   foo' | grep -E '^\s*foo'  <-- **No Output**
$ echo '   foo' | egrep '^\s*foo'  <-- **No Output**
$ echo '   foo' | grep '^[[:space:]]*foo'
   foo

我还注意到它可以识别\w,但不能识别\d

阙1.可以让grep认出\s吗?

Que 2.在哪里可以找到grep 中支持的正则表达式转义序列列表?

操作系统RHEL5

Shell:试过shbashtcsh

$ grep --version
grep (GNU grep) 2.5.1

编辑

我尝试按照答案中的建议使用grep -P,但不幸的是它无法在我的系统上运行并引发以下错误:

$ echo '   foo' | grep -P '^\s*foo'
grep: The -P option is not supported   <-- **ERROR**

【问题讨论】:

  • 仅供参考...在 PERL 中,grep() 接受 \s。我已经在 PERL 中尝试了以下程序,它工作正常。 my @Arr = (" Test", "Test"); @Arr = grep {$_ =~ /^\s+Test/} @Arr; print "@Arr"; 输出:“测试”
  • @Anand 是的。我注意到 PERL 中的 grep 工作正常。我的目的是让它在 linux shell 上工作

标签: regex linux unix grep


【解决方案1】:

没有 grep 或 egrep 无法识别 \s\d(PCRE 特定构造),因为它使用 ERE。请参阅此参考指南:

POSIX and ERE Regex

虽然如果您使用grep -P,那么所有 PCRE 功能都会被识别。

例如

echo '   foo' | grep -P '^\s*foo'
   foo

【讨论】:

  • 不幸的是,-P 选项在我的系统上不起作用。 grep: The -P option is not supported
  • @jkshah:我相信您可以通过 RPM 在 RHEL 上获得 gnu grep
  • 否则需要使用 POSIX:grep '^[[:space:]]*foo'
  • 我已经可以使用 ` *` 和 [[:space:]]*。我没有被卡住,但这个问题是出于好奇。我有grep (GNU grep) 2.5.1,因为我使用的是企业操作系统,所以我无权安装任何新东西!感谢您的回复!
【解决方案2】:

问题 1. 是否可以让 grep 识别 \s ?

使用 Perl 正则表达式模式:

echo '   foo' | grep -P '^\s*foo'

问题 2. 在哪里可以找到 grep 中支持的正则表达式转义序列列表?

man grep

上面写着,例如:

符号 \ 分别匹配单词开头和结尾的空字符串。符号 \b 匹配单词边缘的空字符串,而 \B 匹配空字符串,前提是它不在单词的边缘。符号 \w 是 [[:alnum:]] 的同义词,\W 是 [^[:alnum:]] 的同义词。

没有提到其他 [a-zA-Z]

版本:

grep (GNU grep) 2.14

在 Debian 上

【讨论】:

  • 不幸的是 -P 选项在我的系统上不起作用。 grep:不支持 -P 选项。更新问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
相关资源
最近更新 更多