【问题标题】:regexp and find the smallest matching phrase正则表达式并找到最小的匹配短语
【发布时间】:2016-06-12 06:45:26
【问题描述】:

假设我有一个包含以下行的文件:

文件:“print.exe”,名称:“David Albertas”,地址:“纽约市”

我想使用 grep 和 regexp 来获得输出 -

姓名:“大卫·艾伯塔斯”

只有这个输出!

我写了命令:

 egrep -o "name: \".*\"" script

但我得到的输出比我预期的要大:

姓名:“大卫·艾伯塔斯”,地址:“纽约市”

这还不够好。你能想到一个可以帮助我的正则表达式吗?为方便起见,附上文件。

【问题讨论】:

  • 尝试添加?egrep -o "name: \".*?\"" script

标签: regex grep


【解决方案1】:

您需要一个lazy 量词。 --perl-regexp 使用grep with P flag

grep -oP "name: \".*?\"" script

【讨论】:

  • 谢谢。如果我只想得到没有“name”前缀的“David Albertas”怎么办?你有这方面的正则表达式吗?
  • @CrazySynthax 你可以使用lookbehind: grep -oP "(?<=name: )\".*?\"" script
  • @CrazySynthax 或不带双引号:grep -oP "(?<=name: \")[^\"]+"
  • 或者由于您使用grep -P,您可以使用\K 正则表达式转义序列:grep -oP "name: \K\".*?\"" script 将仅返回“名称”部分
【解决方案2】:

如果您确定(如在您的模式中)封闭引号,您可以使用引号技术的否定:

egrep -o 'name: "[^"]*"' INPUT

如果您只想要名称(在name: 之后),您可能需要使用类似 sed 的名称:

sed 's/.*name: \("[^"]\+"\).*/\1/' INPUT

或者您可以使用带有grep 的环视正则表达式。

grep -oP '(?<=name: )".*?"' INPUT

【讨论】:

  • 谢谢。如果我只想得到没有“name”前缀的“David Albertas”怎么办?你有这方面的正则表达式吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 2020-08-28
  • 1970-01-01
相关资源
最近更新 更多