首页 > 解决方案 > 使用 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

这里只有aaaxxx是固定的,其余都是动态的。

如何在这里只获取匹配的子集?

标签: sed

解决方案


我会使用以下内容:

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命令的工作,现在可以删除

你可以在这里试试


推荐阅读