Grep一无所获

时间:2019-01-16 11:44:23

标签: regex grep

我想把头从桌子上跳下来,所以可以得到任何帮助。

#!/bin/bash
echo 'wahegru.com mail is handled by 1 ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.com.' |  grep '(?<=10 )(\.*+\w)*+'

现在我知道此正则表达式有效:

(?<=10 )(\.*+\w)*+

因为我可以将文本粘贴到https://regex101.com/和正则表达式中,然后它才能找到完全匹配的内容。

为什么它不能用于grep?

编辑,尝试以下操作:

echo 'wahegru.com mail is handled by 1 ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.com.' |  grep -P '(?<=10 )(\.*+\w)*+'

但这给了我这个

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

尝试

echo 'wahegru.com mail is handled by 1 ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.com.' | perl -nle'print if m{(?<=10 )(\.*+\w)*+}'

但这会输出错误的内容:

wahegru.com mail is handled by 1 ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.com.

1 个答案:

答案 0 :(得分:1)

您可以使用

echo 'wahegru.com mail is handled by 1 ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.com.' | \ 
  grep -o '10 [^ .]*\(\.[^ .][^ .]*\)*' | head -1 | sed 's/^10 //'

请参见grep demo online

详细信息

  • o选项提取在输入字符串中找到的匹配项
  • 10 [^ .]*\(\.[^ .][^ .]*\)*个匹配项
    • 10 -文字子字符串
    • [^ .]*-除空格和.之外的0+个字符
    • \(\.[^ .][^ .]*\)*-重复0次或更多次
      • \.-一个点
      • [^ .][^ .]*-除.和空格以外的1个或更多字符
  • head -1-获得第一个比赛
  • sed 's/^10 //'删除初始的10 子字符串。