【问题标题】:No output for regular expression with grep [duplicate]使用 grep 的正则表达式没有输出 [重复]
【发布时间】:2019-04-04 12:58:42
【问题描述】:

我正在尝试使用带有正则表达式的 grep 提取字符串的一部分。我已经使用regexr 测试了正则表达式并且它正在工作。我在 macOS 上。

这是我的代码:

echo -e '"HI":"Hola!"' | grep -o '(?=[^\"]).+?(?=":")'

如果我尝试使用 -P 选项,它会显示 grep 的用法说明:

usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
        [-e pattern] [-f file] [--binary-files=value] [--color=when]
        [--context[=num]] [--directories=action] [--label] [--line-buffered]
        [--null] [pattern] [file ...]

我想得到HI 作为输出。我需要通过管道输出grep 还是我缺少其他东西?

谢谢

【问题讨论】:

  • 您没有使用兼容的正则表达式测试器测试正则表达式。 POSIX BRE 正则表达式不支持环视。你的意思是使用echo -e '"HI:"Hola!""' | grep -Po '(?<=").+?(?=:")'?
  • 你说得对,我用regexr来测试。 -P 选项不起作用,我在 macOS 上。我要更新问题描述。
  • 我用-P 选项解决了这个问题。我必须用brew 安装grep。 macOS 上的 grep 版本存在问题。结果代码是这样的:echo -e '"HI":"Hola!"' | ggrep -Po '(?=[^\"]).+?(?=":")'

标签: bash shell grep


【解决方案1】:

使用 GNU-grep:

$ echo '"HI:"Hola!""' | grep -oP '\w+(?=:)'
HI

或:

$ echo '"HI:"Hola!""' | perl -lne 'print $& if /\w+(?=:)/'
HI

look around explained

【讨论】:

  • 我更新了问题描述。如果我尝试使用 -P 选项,它会显示 grep 的使用说明。
  • 消息是什么?尝试 man grep 以了解是否实现了开关。哪个发行版?哪个 grep ?需要 GNU grep
  • 添加 perl 解决方案
  • 无法使用-P,因为我的grep 版本。我必须使用自制软件安装 grep。结果代码是这样的:echo -e '"HI":"Hola!"' | ggrep -Po '(?=[^\"]).+?(?=":")'。谢谢
【解决方案2】:

如果您没有与 perl 兼容的 grep 版本,请尝试 sed -

$: echo -e '"HI:"Hola!""' | sed -En '/".*?:"/ { s/.*"(.*?):".*/\1/; p; }'
HI

这会抓取" 和:" 之间所有内容的第一次出现。如果不正确,请澄清您的参数。

另外,您可以只使用perl。 :)

【讨论】:

  • 我没有兼容 Perl 的版本。我必须通过自制软件安装它并将其用作ggrep。谢谢
  • sed 可能会更容易,哈哈 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
相关资源
最近更新 更多