我想把头从桌子上跳下来,所以可以得到任何帮助。
#!/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.
答案 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 //'
详细信息
o
选项提取在输入字符串中找到的匹配项10 [^ .]*\(\.[^ .][^ .]*\)*
个匹配项
10
-文字子字符串[^ .]*
-除空格和.
之外的0+个字符\(\.[^ .][^ .]*\)*
-重复0次或更多次
\.
-一个点[^ .][^ .]*
-除.
和空格以外的1个或更多字符head -1
-获得第一个比赛sed 's/^10 //'
删除初始的10
子字符串。