sed - 如何使用sed提取IP地址?

MrD*_*les 13 regex sed

这是一个任务,所以我别无选择,只能使用sed.

给定文件消息,如何提取所有IP地址并打印它们?

我第一次尝试

sed -n '/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' messages
Run Code Online (Sandbox Code Playgroud)

但它什么都没印.经过一些研究,我发现sed不支持非贪婪的运营商吗?和|.

我一直在挣扎我的大脑,但如果没有非贪婪的操作员,我想不出办法做到这一点.我怎样才能做到这一点?

Gil*_*not 30

会更适合那里(如果你有sed,你也应该有grep):

grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])' messages
Run Code Online (Sandbox Code Playgroud)

这是你自己regex没有修改(测试OK)

  • 实际上,有一点不同.并且很难分辨OP实际上正在尝试做什么.你的`grep`代码只返回IP地址.OP实际上可能正在尝试匹配并打印包含IP地址的行.这可能是downvote的原因. (2认同)

Ste*_*eve 10

如果有GNU sed,您只需添加-r标志即可使用ERE:

sed -rn '/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' file
Run Code Online (Sandbox Code Playgroud)

否则,您将需要转义某些字符:

sed -n '/\(\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)/p' file
Run Code Online (Sandbox Code Playgroud)

这些字符包括:

  • 使用括号的组:(,)
  • 发生支撑:{,}
  • '或'管道: |
  • 非贪婪的问号: ?

通常(虽然不适合您的情况)我使用以下内容来匹配IP地址:

sed -rn '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' file
Run Code Online (Sandbox Code Playgroud)

或者在兼容模式下:

sed -n '/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/p' file
Run Code Online (Sandbox Code Playgroud)


Exp*_*lls 8

使用sed -r(扩展正则表达式)或使用转义捕获组\