sed - 使用 sed 从命令输出中提取模式返回整个命令而不是仅匹配的子字符串
问题描述
我正在尝试aa49a30add59
从以下命令中提取,但\1
后向引用没有为我提供子字符串,而是与 -e 选项的整个匹配。
bash$ docker images | grep '^aaa' | sed -e "s/aaa\s+xxx\s+\([0-9]+\)\s+/\1/"
aaa xxx aa49a30add59 33
bash$ docker images | grep '^aaa' | sed -e "s/\(?:aaa\s+xxx\s+\)\([0-9]+\)\s+/\1/"
aaa xxx aa49a30add59 33 minutes ago 1.52 GB
这里只有aaa
和xxx
是固定的,其余都是动态的。
如何在这里只获取匹配的子集?
解决方案
我会使用以下内容:
docker images | sed -nE "s/^aaa\s+xxx\s+([0-9a-f]+)\s*/\1/p"
-E
切换到 ERE 正则表达式风格,其中未转义的括号并被+
解析为元字符。现在你的+
工作,但是- 我们现在需要取消括号。
- 我们需要
[0-9a-f]
而不是[0-9]
匹配十六进制数字 - 可能没有尾随空格,所以
\s*
不是\s+
- 添加anchor、the
-n
和finalp
使sed
命令执行grep
命令的工作,现在可以删除
你可以在这里试试。
推荐阅读
- java - Big Oh Notation for 2 嵌套 for 循环在查找数组中的重复元素
- wcf - 作为 http 和 https 的宁静服务 - iis urlrewrite
- firebase - 当我得到“PERMISSION DENIED”时,如何让我的 Firebase 安全规则允许对我的实时数据库进行身份验证访问
- http - HTTPS 如何影响缓存和安全性?
- python - Windows 桌面应用程序从浏览器读取会话数据
- android - 如何在我的 android 项目中正确启用 android.databinding 库?
- c++ - 如何读取文件中的数字并在 Qt 中将它们作为整数处理
- tinyxml2 - tinyxml 在自结束标记中的斜线之前删除空格?
- php - 如何将控制台显示的内置服务器的事件消息重定向到 C 程序中的文件?
- python - 在熊猫中将业务月结束日期按不同的月份数移动