sed:打印匹配

时间:2019-08-20 07:31:03

标签: regex bash sed

我觉得我太愚蠢了。在我尝试的每种编程语言中,它都可以完美运行,但不能在外壳上使用sed。有人可以向我解释为什么

echo "Version: 4.4.0.157.165" | sed -E 's/.*\Version: (\d+\.\d+.\d+\.\d+)\.\d+//'

再次打印整个字符串,而不是4.4.0.157

最好的问候

它适用于regex101: https://regex101.com/r/eZ1gT7/2035

1 个答案:

答案 0 :(得分:1)

您需要使用

echo "Version: 4.4.0.157.165" | sed -E 's/.*Version: ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\.[0-9]+/\1/'

或者,进一步增强功能:

sed -E 's/.*Version: ([0-9]+(\.[0-9]+){3})\.[0-9]+/\1/' <<< "Version: 4.4.0.157.165"

请参见online sed demo

注意:

  • 请勿在不应该使用反斜杠的地方使用反斜杠(在\之前删除V
  • \d is not supported in sed,即使使用[0-9]选项,也要使用-E
  • 您需要在替换部件中使用\1占位符来放回在第1组中捕获的内容
  • 其中一个点没有逃脱
  • 如果连续的子图案重复出现,则最好使用范围量词。 [0-9]+(\.[0-9]+){3}匹配1个以上的数字,然后匹配3次出现的.和1个以上的数字。

再三考虑,您可能希望从较大的字符串中提取版本。然后,使用

sed -nE 's/.*Version: ([0-9]+(\.[0-9]+){3})\.[0-9].*/\1/p' <<< "Version: 4.4.0.157.165"
相关问题